CSDN使用了spring的webflow

这个隐藏参数可以理解成每个需要登录的用户都有一个流水号。只有有了webflow发放的有效的流水号,用户才可以说明是已经进入了webflow流程。否则,没有流水号的情况下,webflow会认为用户还没有进入webflow流程,从而会重新进入一次webflow流程,从而会重新出现登录界面。

import requests

from bs4 import BeautifulSoup

#######################################################

# Replace special characters in string using the %xx escape. Letters, digits,

# and the characters '_.-' are never quoted.

# Python 3 可以这么引入

from urllib.parse import quote

#### 控制台输入账号密码相关, 如有特殊密码保护,应使用getpass(需要注意的是Pycharm对此支持的不好)

import getpass

# Python 2 需要这么引入

# import urllib.quote

class CSDN(object):

"""

CSDN模拟登陆并加上点赞,评论,私信等功能。

"""

def __init__(self, headers):

"""

:param session: 创建全局的session对象,保证会话的一致性,有效性。

:param headers: 防止服务器端反爬虫,添加伪装头部信息

"""

self.session = requests.Session()

self.headers = headers

def login(self, account, passwd):

"""

模拟登陆,点赞, 发评论,发私信的前提都是已在登录状态下进行的,这是前提。

:param account: 用户名

:param passwd: 密码

:return:

"""

self.username = account

self.password = passwd

# 只有获取到webflow流水号,才会正式进入登陆通道,服务器端对此进行了限制。

lt, execution = self.get_webflow()

# 要提交的表单数据

postdata = {

'username': account,

'password': passwd,

"lt": lt,

"execution": execution,

"_eventId": "submit"

}

## 开始登陆

loginurl = 'https://passport.csdn.net/account/login'

response = self.session.post(url=loginurl, headers=self.headers, data=postdata)

if response.status_code == 200:

print('恭喜您登陆成功!')

else:

print(response.text)

print('登录失败,请重试!')

def get_webflow(self):

"""

流水号webflow获取。随便访问包含登陆页链接的CSDN网页就可以得到这串数据。应为是动态变化的

所以,先获取下来,以备使用。

:return:

"""

url = 'https://passport.csdn.net/account/login?ref=toolbar'

response = self.session.get(url=url, headers=self.headers)

soup = BeautifulSoup(response.text, 'html.parser')

lt = soup.find('input', {'name': 'lt'})['value']

execution = soup.find('input', {'name': 'execution'})['value']

# 释放不必要的对象

soup.clear()

return (lt, execution)

def digg(self, articleurl, digg=True):

"""

把给定的文章路径 http://blog.csdn.net/marksinoberg/article/details/69569353

先转化一下为: http://blog.csdn.net/marksinoberg/article/digg?ArticleId=69569353

:param articleurl 待操作的文章路径

:param digg: 给文章点赞还是踩一下

:return:

"""

try:

bloguser, blogid = articleurl.split('/')[3], articleurl.split('/')[-1]

if digg==True:

diggurl = 'http://blog.csdn.net/{}/article/digg?ArticleId={}'.format(bloguser, blogid)

else:

diggurl = 'http://blog.csdn.net/{}/article/bury?ArticleId={}'.format(bloguser, blogid)

except:

print('您输入的文章路径非法!')

print("待操作文章的路径: ", diggurl)

self.headers['X-Requested-With'] = 'XMLHttpRequest'

self.headers['Host'] = 'blog.csdn.net'

self.headers['Referer'] = articleurl

response = self.session.get(url=diggurl, headers=self.headers)

if response.status_code == 200:

# print("Digg 操作成功", response.text)

articlejson = response.json()

digg, bury = articlejson['digg'], articlejson['bury']

print('文章:{}\n:被点赞数:{}, 被踩数:{}'.format(articleurl, digg, bury))

else:

print('网络或服务器出现了问题,点赞操作出现了点故障!')

self.headers['Referer'] = ''

def comment(self, articleurl, content):

"""

给定一个文章的路径http://blog.csdn.net/marksinoberg/article/details/69569353,

需要转化为形如: http://blog.csdn.net/Marksinoberg/comment/submit?id=69569353

:param articleurl:

:param content:

:return:

"""

try:

bloguser, blogid = articleurl.split('/')[3], articleurl.split('/')[-1]

commenturl = 'http://blog.csdn.net/{}/comment/submit?id={}'.format(bloguser, blogid)

except:

print(commenturl, ' 不是一个合法的路径!')

print(commenturl)

postdata = {

'commentid': self.username,

'replyid': bloguser,

'content': content

}

response = self.session.post(url=commenturl, headers=self.headers, data=postdata)

if response.status_code == 200:

print(response.json())

if response.json()['result'] == 1:

print('评论成功咯!')

else:

print('服务器访问成功,但评论操作失败了!')

else:

print('评论出现了点异常!')

def letter(self, receiver, content):

letterurl = 'http://msg.csdn.net/letters/send_message?receiver={0}&body={1}'.format(receiver, quote(content))

response = self.session.get(url=letterurl, headers=self.headers)

if response.status_code == 200:

print("私信内容发送成功!")

# print(response.text)

## 这里服务器返回的是一大串HTML代码。通过解析还可以得到本人和其他博友的私信记录。

else:

print('私信发送失败!请检查网络是否通畅。')

def publish_article(self):

"""

核心URL: http://write.blog.csdn.net/postedit?edit=1&isPub=1&joinblogcontest=undefined&r=0.14573376474383326

有兴趣的可以尝试着做一下。

需要提交的表单信息为:

titl:1234567 # 博客标题

typ:1 # 原创1, 转载2, 翻译3

cont:自动发现一篇好文章的前提是什么? # 发表的文章内容

desc:自动发现一篇好文章的前提是什么? # 发表的摘要信息

tags: # 标签们

flnm:69803183 # 博客ID(如果是新文章默认没有的)

chnl:0 # 文章类型: 编程语言啊, 系统架构啊什么的

comm:2

level:0

tag2:

artid:0

checkcode:undefined

userinfo1:713

stat:publish

:return:

"""

if __name__ == '__main__':

headers = {

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36",

}

csdn = CSDN(headers=headers)

account = input('请输入您的账号:')

password = getpass.getpass(prompt='请输入您的密码:')

csdn.login(account=account, passwd=password)

# 评论测试

# csdn.comment('http://blog.csdn.net/marksinoberg/article/details/69569353', '哈哈,爬虫评论')

# 点赞,踩测试。digg为True为顶, 为False即踩

# csdn.digg('http://blog.csdn.net/marksinoberg/article/details/69569353', digg=True)

# 私信测试

# csdn.letter(receiver='marksinoberg', content='僚机呼叫主机,收到请回复,Over!')

python 模拟登录验证码_Python模拟登陆 —— 征服验证码 3 CSDN相关推荐

  1. python的模拟登录原理_Python模拟登陆实例详解

    本篇文章主要介绍了Python模拟登陆实现代码,这里整理了详细的代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 下面分享一个使用Python进行网站模拟登陆的小例子. 原理 使用Cookie技 ...

  2. python模拟登录网站_Python模拟登录淘宝都实现了,你还怕模拟登录?

    文章转载自公众号 :裸睡的猪 , 作者 猪哥66 最近想爬取淘宝的一些商品,但是发现如果要使用搜索等一些功能时基本都需要登录,所以就想出一篇模拟登录淘宝的文章! 看了下网上有很多关于模拟登录淘宝,但是 ...

  3. php 模拟登录淘宝taobao阿里妈妈|模拟登录淘宝联盟|curl模拟登录淘宝|模拟登陆淘宝采集数据

    php 模拟登录淘宝taobao阿里妈妈|模拟登录淘宝联盟|curl模拟登录淘宝|模拟登陆淘宝采集数据 在很多项目中我们可能要采集淘宝会员中心的一些数据.但是程序采集的时候会员中心必须是登录的,这里我 ...

  4. python12306自动抢票为什么进入个人中心,python自动登录12306并自动点击验证码完成登录的实现源代码...

    以下代码可自动登录12306 - 包括输入用户名密码以及自动识别验证码并点击验证码登陆.该源码需要稍作修改: 把  username.send_keys('xxxxxxx')  中的  xxxxxx ...

  5. html手机qq登陆验证码,为什么qq登陆需要验证码?qq登陆需要验证码怎么取消?...

    为什么qq登陆需要验证码?qq登陆需要验证码怎么取消?很多用户在登陆qq时,总是需要输入验证码,一些用户表示很烦,那么大家知道为什么qq登陆需要验证码吗?如果不想每次登陆qq都需要验证码该如何取消呢? ...

  6. python模拟密码有效性检测功能_Python模拟登陆 —— 征服验证码 3 CSDN-阿里云开发者社区...

    CSDN使用了spring的webflow 这个隐藏参数可以理解成每个需要登录的用户都有一个流水号.只有有了webflow发放的有效的流水号,用户才可以说明是已经进入了webflow流程.否则,没有流 ...

  7. python模拟登录网站_Python爬虫实战之(四)| 模拟登录京东商城

    作者:xiaoyu 微信公众号:Python数据科学 知乎:Python数据分析师 前两篇和大家分享了爬虫中http的一些概念和使用方法,基础篇我们主要介绍了http的请求头,高级篇我们主要介绍了co ...

  8. python模拟全部代码_Python模拟登陆实现代码

    下面分享一个使用Python进行网站模拟登陆的小例子. 原理 使用Cookie技术,绕开网站登录验证.要使用到cookielib库.流程: 创建一个保存Cookie的容器,可选的有CookieJar, ...

  9. python模拟登录网站_Python爬虫之模拟登录wechat

    不知何时,微信已经成为我们不可缺少的一部分了,我们的社交圈.关注的新闻或是公众号.还有个人信息或是隐私都被绑定在了一起.既然它这么重要,如果我们可以利用爬虫模拟登录,是不是就意味着我们可以获取这些信息 ...

最新文章

  1. 和老同事的谈话:关于职业生涯以及MDA
  2. IOS开发之UI手势
  3. 图解understand分析一个asp.net办公系统源码
  4. idea GsonFormat插件使用报错 StringIndexOutOfBoundsException: begin 0, end -1, length 9
  5. krsort函数怎么用php,krsort函数怎么用
  6. twitter storm源码走读(二)
  7. 深度学习--Keras总结
  8. web前端-----跨域
  9. 解除Linux最大进程数和最大文件句柄打开数限制
  10. 摄像机跟随以及注视旋转和角度变化
  11. 【从C到C++学习笔记】C++介绍/推荐书籍/开发工具
  12. 【资料分享】500篇干货解读人工智能新时代
  13. 小米台灯突然自己亮了_除了彩屏和小爱,还有哪些升级?——小米手环4 NFC版...
  14. C语言邮箱名字用什么存储,用c++定义一个描述学生通讯录的类数据成员包括姓名学校电话号码和邮箱...
  15. 【优化】COUNT(1)、COUNT(*)、COUNT(常量)、COUNT(主键)、COUNT(ROWID)、COUNT(非空列)、COUNT(允许为空列)、COUNT(DISTINCT 列名)
  16. 如何用项目甘特图,做好项目汇报
  17. 在html中插入avi视频,兮夜2000杀成就达成,JDG优势局连续失误
  18. 年轻有为!我与94年的LeetCode CEO同台登场!
  19. 微软官方补丁6B BUG造成WIN7系统蓝屏解决方案
  20. 简历应该怎么写,HR看一篇简历仅需要5秒吗,简历模板大全

热门文章

  1. 一名网工对Linux运维的一次经历
  2. linux统计多个文件大小总和
  3. amoeba安装与简单使用(一)
  4. js语法、关键保留字、变量、数据类型
  5. 转:全栈工程师的知识栈列表
  6. 在新美大“创业”:KTV预定业务演进之路
  7. Github上不错的Android开源代码(一)
  8. 20CM网线你会拿来干什么??
  9. C# word 转 pdf
  10. HTML5 Canvas 和 SVG