豆瓣自动登陆发广播(python), 豆瓣圣经Bot

一个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被封
虽然中间忘记设置登陆频率导致IP被封,但问题不大

接下来就可以丢到Linux上面试试看了, 搞定了一堆依赖
开跑!

如何解决验证码问题

担心的事情发生了, 返回文本提示需要图形验证码,
验证码问题
一般新IP登陆账号都需要验证一次, 我傻了, 我怎么在这个Linux终端打开豆瓣手动登陆嘛, 又没有图形化操作界面, Linux的操作都是现学现用.

我转变思路, 那我把我的笔记本IP换成云服务器IP, 再在笔记本上登陆不就行了? 妈呀我真聪明 , 现在有不少一键ss脚本, 我觉得是一个不错的选择, 这里不赘述了, 百度有

IP
图片显示的云服务器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()

验证码问题解决后, 就没什么难题了接下来介绍一下发送机制和使用方法

使用文档

  1. 准备好你要发送的内容, 用excel保存好(只使用第A列)
    圣经我这里的excel命名为thebibleexecl.xls
    在这里插入图片描述

1.将所给的bot.py以及thebibleexecl.xls放置于同一目录下

2.打开bot.py 修改数据
mian
这个脚本的行数不多, 可以很快找到

3.登陆豆瓣并且查看cookie(我这里是kxyi) (记得在自动登陆框选打勾)
在这里插入图片描述把cookie写到’???'那里
在这里插入图片描述4.保存, 打开终端键入python bot.py运行即可
5.其它说明:
豆瓣广播的发送频率可自定义, 修改while循环的内容即可.

写在最后

截止2020年10月13日22点34分, 圣经Bot共发送广播6549条, 2591被关注
在这里插入图片描述

面对一个几乎陌生的python和Linux, 这个小项目我搞了2星期(事实上是一个月, 但因为懒所以加起来的时间也就2星期 ), 学到了不少东西, 本来一弄完就想写一个总结的, 结果从4月拖到国庆结束…

写下此篇, 告诉自己作业还没写完
希望自己别老是拖延吧

期待各位的评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值