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高性能编程》——2.14 确保性能分析成功的策略-阿里云开发者社区...

    本节书摘来自异步社区<Python高性能编程>一书中的第2章,第2.14节,作者[美] 戈雷利克 (Micha Gorelick),胡世杰,徐旭彬 译,更多章节内容可以访问云栖社区&quo ...

  2. 树莓派python编程读取电压_《树莓派Python编程指南》——3.2 在结构体中存储值-阿里云开发者社区...

    本节书摘来自华章计算机<树莓派Python编程指南>一书中的第3章,第3.2节,作者:(美) Alex Bradbury Ben Everard更多章节内容可以访问云栖社区"华章 ...

  3. python模拟密码有效性检测功能_用Python程序检查密码的有效性?

    给定密码,我们的任务是检查该密码是否有效.在这里,我们使用提供正则表达式的re模块,并使用re.search()来检查字母,数字或特殊字符的有效性. 算法Step 1: first we take a ...

  4. python模拟密码有效性检测功能_检查密码有效性(Django/Python)

    我有一个非常小的Django应用程序,主要是为了学习.我使用的是Django提供的内置用户模型.为了学习这个功能,我创建了一些页面,这些页面允许我创建和编辑用户,而不必进入管理面板.在 registe ...

  5. python简单体育竞技模拟_Python程序设计思维练习---体育竞技分析-阿里云开发者社区...

    体育竞技分析:模拟N场比赛 计算思维:抽象 + 自动化 模拟:抽象比赛过程,自动模拟N场比赛,当N越大时,比赛结果分析越科学. 本次比赛规则:回合制,15分一局,先由一方发球,如胜利,则得1分并继续发 ...

  6. python 做网站 知乎_python做网站 知乎的搜索结果-阿里云开发者社区

    伤不起的全栈程序员 前段时间听说一个新名词:"全栈程序员",google了一下,被引导到了知乎的一个讨论上: http://www.zhihu.com/question/22420 ...

  7. python公司大部分编码风格_Python编码风格篇:比较运算符-阿里云开发者社区

    前几天有看到一篇 Flask 开发团队内部 Python 编码风格指南 ,里面有一段关于比较的规范觉得很有意思: 任意类型之间的比较,使用 == 和 != 与单例(singletons)进行比较时,使 ...

  8. python列表做参数传值_python不定参数传值怎么做-问答-阿里云开发者社区-阿里云...

    使用arg_name定义的位置参数,表示任意多个位置参数:Python标准库中习惯使用args来命名不定长位置参数,当然我们可以自定义 这个名称:不定长位置参数的类型为元组: Python 允许在形参 ...

  9. 命令python所在的驱动器和文件夹_Python文件夹与文件的操作-阿里云开发者社区...

    最近在写的程序频繁地与文件操作打交道,这块比较弱,还好在百度上找到一篇不错的文章,这是原文传送门,我对原文稍做了些改动. 有关文件夹与文件的查找,删除等功能 在os模块中实现.使用时需先导入这个模块, ...

最新文章

  1. 信道编码之差错控制原理
  2. 写给那些在技术路上奔跑的人们!!!!!
  3. Java内存溢出分析
  4. 这位RD同学,你好像对JD有点误解!
  5. 【洛谷P2680】运输计划
  6. php7 获取文件类型,太简单了!PHP获取文件扩展名的7中方法
  7. 如何:通过现有代码创建 C++ 项目
  8. 计算机网络基础笔记 运输层协议UDP/TCP
  9. dockerfile用yum安装mysql服务
  10. [ZJOI2005]午餐 贪心+dp
  11. Asp.net中Application Session Cookie ViewState Cache
  12. MAC PS更换登记照背景颜色
  13. 快速开发大热风潮之下 这免费的羊毛不来薅薅?
  14. 在线教育项目-npm install失败-下载依赖失败-(vue-admin-template-master)
  15. cloudstack上传模板时候的一个报错
  16. 20200425-读后感-第五项修炼1-系统思考
  17. 嵌入式Linux内核配置、裁剪与编译浅析(ARM版)
  18. javaString-StringBuilder-StringBuffer
  19. EventBus使用详解(二)——EventBus使用进阶
  20. 队列--先进先出的线性表

热门文章

  1. 使用3DMAX制作“黄房子”教程(三)
  2. 九城招聘研发高级工程师
  3. 通过TikTok的发展历程来分析未来的趋势,找到2022年的热点在哪里?跨境卖家必看的综合分析
  4. java 分部类_C#中分部类和分部方法的应用
  5. 二苯基环辛炔-氨基;DBCO-NH2科研实验用试剂DBCO-Amine;CAS:1255942-06-3
  6. 学术诚信的重要性_学术诚信在高校教育工作中的重要性
  7. 最全的实际面试题大总结
  8. 什么是 Byzer-lang ? 一门面向大数据和 AI 的开源云原生编程语言
  9. 给麦田PT做的新主题:Harvest
  10. win 10 ie恢复