一个python脚本, 豆瓣圣经Bot
bot作者: 不学无术妳卿💊 bot名稱:聖經bot
bot鏈接:https://www.douban.com/people/The_BiBle/
頻率:一小時一條(不定時抽風,如果斷更了請告知……)
聖經版本是,簡體新譯本。推文是從創世記開始按順序逐句發送。https://www.douban.com/doubanapp/dispatch?uri=/status/2671675862/
為紀念19年10月廣播停用和豆瓣復活節而作。
此bot于2020年初交给本人运营
这里先记录一下交付过程,至于代码怎么用,我会在最后说明
这个bot的技术含量并不高
一开始这个脚本是运行在笔记本上面的, 这就会产生一个问题, 一旦笔记本关机, bot就会断更, 于是就需要找到一台24小时不关机的机器, 云服务器是一个不错的选择.
疫情期间, 恰好阿里云有学生身份白嫖服务器的活动, 那会可以白嫖一年(事实上是先让你免费使用半年, 再让你考试, 考试要上传身份证照片和开启摄像头, 不允许切屏, 弹窗2次直接0分, 而我的服务器白嫖之旅也将在2020年10月底结束. )
云服务器准备好了, 接下来就是改写登陆脚本了
顺便吐槽一句, 交付时代码的对齐非常令我不舒服, 有的地方使用了tab, 有的地方使用了空格
我整理了一阵, 加了点注释,
初期代码
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests, json, string
import datetime
import time
import xlrd
import xlwt
from urllib.parse import quote
def login(session, home_url, login_post_url, headers):
douban_nickname = "圣经bot" # 用于判断是否登录成功
#passnmae_prompt = "请输入您的登录帐号:"
#password_prompt = "请输入您的登录密码:"
while True:
passname = "?????????"#账号
password = "?????????"#密码
login_form_data = {}
login_form_data["ck"] = " "
login_form_data["name"] = passname
login_form_data["password"] = password
login_form_data["remember"] = "false"
login_form_data["ticket"] = " "
session.post(login_post_url, data=login_form_data, headers=headers)
check_response_text = session.get(home_url, headers=headers).text
if douban_nickname in check_response_text:
print()
print("登录成功")
return session
else:
print()
print("登录失败,请重新尝试.")
passnmae_prompt = "请重新输入登录帐号:"
password_prompt = "请重新输入登录密码:"
continue
# 请修改为你的 Consumer
#consumer = {'key': 'consumer key', 'secret': 'consumer secret'}
# 请修改为你的 ID 和密码
#client = fanfou.XAuth(consumer, 'username', 'password')
#fanfou.bound(client)
def work():
global Indexxx
global botstrings
now = datetime.datetime.now()
excel = xlrd.open_workbook("thebibleexecl.xls")
excel.sheet_names()
sheet = excel.sheet_by_index(0)
botstrings = sheet.cell(Indexxx, 0).value
#workbook = xlwt.Workbook()
#worksheet = workbook.add_sheet('test')
#worksheet.write(Indexxx, 1, 'Done')
#workbook.save('excelwrite.xls')
Indexxx = Indexxx + 1
print(Indexxx)
print(botstrings)
def main():
global Indexxx
global botstrings
Indexxx = 2440
while True:
#print("running")
now = datetime.datetime.now()
if now.minute < 1:
work()
home_url = "https://www.douban.com/"
login_post_url = "https://accounts.douban.com/j/mobile/login/basic"
headers = {}
headers[
"User-Agent"] = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"
session = requests.Session() # 创建会话,以保持登录状态.
login(session, home_url, login_post_url, headers) # 登录帐号
data = {
'ck': 'npDI',
'comment': botstrings,
'privacy_and_reply_limit': 'P,'
}
response = session.post(url='https://www.douban.com/', data=data, headers=headers, )
time.sleep(60)
if __name__ == "__main__":
main()
初(粗 )看代码
毕竟python我又没仔细学过, 只是粗略了解了数组字符串等基本概念, 我花了好些时间阅读了代码, 发现了不少代码是无用的, 原作者又舍不得删, 那好吧, 只能是我帮忙删了.
云服务器是Linux操作系统, 我先降低难度, 这脚本得先在我的电脑(window)能跑, 登陆是使用cookie进行自动登陆的, 那么我的就得先手动登陆一遍, 登陆时将下次自动登陆选框给勾上
代码使用返回文本是否有豆瓣ID判断是否登陆成功
if douban_nickname in check_response_text.text:成功 else:失败
当然用requests.Session().get.text的文本
失败
于是怀疑是不是post环节出了问题 post=session.post(url=login_post_url, data=login_form_data, headers=headers) text情况如下 {“status”:“failed”,“message”:“parameter_missing”,“description”:“参数缺失”,“payload”:{}}
这时候还需要cookies
浏览器F12走起 得到 cookies={ ‘ap_v’:‘0,6.0’ , ‘bid’:‘Dmha1rYraOc’, 'ct ':‘y ‘, ‘ll’: “118301” , ‘ps’ :‘y’ , ‘push_doumail_num’: ‘0’ , ‘push_noty_num’:’ 0’ , } 添加cookie到post里面即可成功登陆
接下来的发送广播也正常,
虽然中间忘记设置登陆频率导致IP被封,但问题不大
接下来就可以丢到Linux上面试试看了, 搞定了一堆依赖
开跑!
如何解决验证码问题
担心的事情发生了, 返回文本提示需要图形验证码,
一般新IP登陆账号都需要验证一次, 我傻了, 我怎么在这个Linux终端打开豆瓣手动登陆嘛, 又没有图形化操作界面, Linux的操作都是现学现用.
我转变思路, 那我把我的笔记本IP换成云服务器IP, 再在笔记本上登陆不就行了? 妈呀我真聪明 , 现在有不少一键ss脚本, 我觉得是一个不错的选择, 这里不赘述了, 百度有
图片显示的云服务器10月底就过期了, 得花真金白银买一个了
最终代码
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests
import datetime
import time
import xlrd
import xlwt
# import sys#解决python读取网页问题 这个是python2的写法
# reload(sys)
# sys.setdefaultencoding( "utf-8")
import importlib,sys
importlib.reload(sys)#python3这么写
def login(session, home_url, login_post_url, headers,cookies,douban_nickname,data):
check_response_text=session.post(url=login_post_url,headers=headers, cookies=cookies, data=data)
if douban_nickname in check_response_text.text :
print("登录成功\n")
return 1
else:
print()
print("登录失败,请重新尝试.\n")
return 0
def work():
global Indexxx
global botstrings
now = datetime.datetime.now()
excel = xlrd.open_workbook("thebibleexecl.xls")
excel.sheet_names()
sheet = excel.sheet_by_index(0)
botstrings = sheet.cell(Indexxx, 0).value
print(Indexxx)
print(botstrings)
Indexxx = Indexxx + 1
def main():
global Indexxx
global botstrings
home_url = "https://www.douban.com/"
login_post_url = "https://accounts.douban.com/j/mobile/login/basic"
Indexxx = 0 #excel行数,自由更改,从0开始
douban_nickname = "圣经bot" # 账户名称
passname = "?????????????"# 账号
password = "?????????????"# 密码
cookies = {
'bid': 'Iy1iQ2_qV-c',
'douban-fav-remind': '1',
'll': '118299',
'viewed': '30118140',
'vtd-d': '2',
'apiKey': '',
'last_login_way': 'account',
'ap_v': '0,6.0',
'push_noty_num': '0',
'push_doumail_num': '0',
'login_start_time': '1587560455793',
}
headers = {
'Connection': 'keep-alive',
'Accept': 'application/json',
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Mobile Safari/537.36',
'Content-Type': 'application/x-www-form-urlencoded',
'Origin': 'https://accounts.douban.com',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Referer': 'https://accounts.douban.com/passport/login_popup?login_source=anony',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
}
data = {
'ck': '',
'name': passname,
'password': password,
'remember': 'false',
'ticket': ''
}
session = requests.session()
i=0
i=login(session, home_url, login_post_url, headers,cookies,douban_nickname,data)
while i==1:
#print("running")
now = datetime.datetime.now()
if now.minute < 1:#当前分钟数小于1, 即整点
work()
string_data = {
'ck': '??????',#cookie
'comment': botstrings,#广播内容
'privacy_and_reply_limit': 'P,'#豆瓣广播的隐私和权限设置, P逗号代表所有人
}
session.post(url=home_url, data=string_data, headers=headers)
print("发送广播")
time.sleep(60)#休眠60秒
if __name__ == "__main__":
main()
验证码问题解决后, 就没什么难题了接下来介绍一下发送机制和使用方法
使用文档
- 准备好你要发送的内容, 用excel保存好(只使用第A列)
我这里的excel命名为thebibleexecl.xls
1.将所给的bot.py以及thebibleexecl.xls放置于同一目录下
2.打开bot.py 修改数据
这个脚本的行数不多, 可以很快找到
3.登陆豆瓣并且查看cookie(我这里是kxyi) (记得在自动登陆框选打勾)
把cookie写到’???'那里
4.保存, 打开终端键入python bot.py运行即可
5.其它说明:
豆瓣广播的发送频率可自定义, 修改while循环的内容即可.
写在最后
截止2020年10月13日22点34分, 圣经Bot共发送广播6549条, 2591被关注
面对一个几乎陌生的python和Linux, 这个小项目我搞了2星期(事实上是一个月, 但因为懒所以加起来的时间也就2星期 ), 学到了不少东西, 本来一弄完就想写一个总结的, 结果从4月拖到国庆结束…
写下此篇, 告诉自己作业还没写完
希望自己别老是拖延吧
期待各位的评论