zoukankan      html  css  js  c++  java
  • python requests 简单实现易班自动登录,批量_文章发布,投票发布,评论,点赞,v2.0

    小编能力有限,本文纯属瞎编,如有异议,你去打辅导员涩

    一.前戏

        有个操蛋,操蛋,操蛋的辅导员促使小编成长,原因:易班需要活跃度,辅导员安排班上每个人必须去易班上 写文章,写评论,发投票...  我觉得辅导员肯定小瞧我们了,我们班像好好刷易班的人嘛。

        结果就鸡儿了涩,都没去发。直接导致辅导员强行安排(早上6.50格老子全班跑操,跑到易班活跃度足够为止!!!), 不要问我那个学校的,厂长也不是我表哥

    二.话不多说,上码

     

    登录易班

     1 person = requests.Session()
     2 cookies = person.cookies.get_dict()  # cookies
     3 # print(cookie
     4 person.headers = {
     5     "Accept": "application/json, text/javascript, */*; q=0.01",
     6     "Accept-Encoding": "gzip, deflate, br",
     7     "Accept-Language": "zh-CN,zh;q=0.9",
     8     "Connection": "keep-alive",
     9     "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
    10     # "Host": "q.yiban.cn",
    11     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
    12                   "(KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"
    13 }
    14 user ="你的"
    15 password ="你的"
    16 # 登录易班
    17 def login(user, password):
    18     login_page_url = "https://www.yiban.cn/login"
    19     login_page_res = person.get(url=login_page_url,cookies=cookies)
    20     # print(login_page_res.text)
    21     # 获取公钥并加密
    22     public_key = re.findall(r"BEGIN PUBLIC KEY-----sM(.*)-----END PUBLIC KEY", login_page_res.text, re.S)[0]
    23     public_key = '-----BEGIN PUBLIC KEY-----
    M' + public_key + '-----END PUBLIC KEY-----'
    24     rsa_key = RSA.importKey(public_key)
    25     x = rsa.encrypt(password.encode(), rsa_key)
    26     rsa_pass = base64.b64encode(x).decode()
    27     # 获取时间戳
    28     keys_time = re.findall(r"data-keys-time='(.*?)'", login_page_res.text)[0]
    29     check_in = captcha()
    30     # random = time.time()
    31     # random = round(random, 2)  # 只取两位小数
    32 
    33     # 登录易班
    34     login_url = "https://www.yiban.cn/login/doLoginAjax"
    35     login_data = {
    36         "account": user,
    37         "password": rsa_pass,
    38         "captcha": check_in,
    39         "keysTime": keys_time
    40     }
    41 
    42     login_res = person.post(url=login_url, data=login_data, cookies=cookies)
    43     # print(login_res.json())
    44     # 获取登录结果
    45     getlogin_url = "http://www.yiban.cn/ajax/my/getLogin"
    46     getlogin_data = {
    47         "": ""
    48     }
    49     getlogin_res = person.post(url=getlogin_url, data=getlogin_data)
    50     print(getlogin_res)
    51     getlogin_res_content = getlogin_res.json()
    52     print(getlogin_res_content)
    53     # messages = person.post(url='http://www.yiban.cn/forum/article/listAjax',data=login_data)
    54     # print(messages.text)
    55 
    56 
    57 # 验证码
    58 def captcha():  # 图片验证码
    59     captcha_check_url = "https://www.yiban.cn/captcha/index?Tue%20Dec%2004%202018%2000:01:2" 
    60                         "6%20GMT+0800%20(%E4%B8%AD%E5%9B%BD%E6%A0%87%E5%87%86%E6%97%B6%E9%97%B4)"
    61     captcha_check_respond = person.get(url=captcha_check_url)
    62     print(captcha_check_respond)
    63     captcha_content = captcha_check_respond.content  # 转换类型
    64     fb = open('captcha.jpg', 'wb')  # 把字节类型转换为图片文件
    65     fb.write(captcha_content)
    66     fb.close()
    67     check_in = input("请输入图片验证码>>>:")
    68     return check_in

      

     

     

    批量文章发布,投票发布,点赞,评论

    注:使用了多线程,优点:速度更快,缺点:容易封号,慎重使用

      

      1 Author:jum
      2 from yibanban.common.common import *
      3 
      4 
      5 def get_article_id():  # 获取文章id
      6     json_data_list = {
      7         "channel_id": 自己的,
      8         "puid": 自己的,
      9         "page": 1,
     10         "size": 10,
     11         "orderby": "updateTime",
     12         "Sections_id": -1,
     13         "need_notice": 0,
     14         "group_id": 自己的,
     15         "my": 0,
     16         "lastId": 自己的
     17     }
     18     res = person.post(url="http://www.yiban.cn/forum/article/listAjax", data=json_data_list)
     19     # 获取json数据
     20     json_list0 = res.json()
     21     # 数据筛选
     22 
     23     # article_list = re.findall("id(.*?)Channel_id", str(json_list0))
     24     article_list = jsonpath.jsonpath(json_list0, '$..id')
     25     article_list1 = re.findall("([56789][0-9]{7})", str(article_list))
     26     # for i in article_list:
     27     #     n = re.findall("d+",i)
     28     #     for m in n:
     29     #         article_list1.append(m)
     30     # jsonpath文档https://www.cnblogs.com/aoyihuashao/p/8665873.html
     31     print(json_list0)
     32     print(type(article_list))
     33     print(article_list)
     34     print(article_list1)
     35     return article_list1
     36 
     37 
     38 # 文章点赞
     39 def good():  # 点赞
     40     article_id = change_page()
     41     for i in article_id:
     42         print(i)
     43         article_data = {
     44             "article_id": i,
     45             "channel_id": 自己的,
     46             "puid": 自己的
     47         }
     48         good_res = person.post(url="http://www.yiban.cn/forum/article/upArticleAjax", data=article_data, headers={
     49             'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36',
     50             'Accept': 'application/json, text/javascript, */*; q=0.01',
     51             'Accept-Language': 'zh-CN,zh;q=0.9',
     52         })
     53         print(good_res)
     54 
     55 
     56 # 文章评论
     57 def comment():  # 评论
     58     article_id = change_page()
     59     for i in article_id:
     60         print(i)
     61         article_data = {
     62             "channel_id": 自己的,
     63             "puid": 自己的,
     64             "article_id": i,
     65             "content": "弟子规",
     66             "reply_id": 0,
     67             "syncFeed": 1,
     68             "isAnonymous": 0
     69         }
     70         good_res = person.post(url="http://www.yiban.cn/forum/reply/addAjax", data=article_data,
     71                                headers={
     72                                    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36',
     73                                    'Accept': 'application/json, text/javascript, */*; q=0.01',
     74                                    'Accept-Language': 'zh-CN,zh;q=0.9',
     75                                })
     76         print(good_res)
     77 
     78 
     79 # 翻页
     80 def change_page():  # 翻页
     81     num_page = 1
     82     article_list2 = []
     83     for num in range(10):
     84         json_data_list = {
     85             "channel_id": 281421,
     86             "puid": 7245623,
     87             "page": num_page,
     88             "size": 10,
     89             "orderby": "hotScore",
     90             "Sections_id": -1,
     91             "need_notice": 0,
     92             "group_id": 457740,
     93             "my": 0
     94         }
     95         num_page += 1
     96         res = person.post(url="http://www.yiban.cn/forum/article/listAjax", data=json_data_list)
     97         # 获取json数据
     98         json_list0 = res.json()
     99         # 数据筛选
    100         # article_list = re.findall(".*id(.*)Channel_id.*", json_list0)
    101         article_list = jsonpath.jsonpath(json_list0, '$..id')
    102         # jsonpath文档https://www.cnblogs.com/aoyihuashao/p/8665873.html
    103         print(json_list0)
    104         article_list1 = re.findall("([56789][0-9]{7})", str(article_list))
    105         for a in article_list1:
    106             article_list2.append(a)
    107         # jsonpath文档https://www.cnblogs.com/aoyihuashao/p/8665873.html
    108         print(json_list0)
    109         print(type(article_list))
    110         print(article_list)
    111         print(article_list1)
    112     print(article_list2)
    113     return article_list2
    114 
    115 
    116 # 添加文章
    117 def article_add():
    118     article_data = {
    119         "puid": 自己的,
    120         "pubArea": 自己的,
    121         "title": "test",
    122         "content": "<p>this is robot auto article!!!!!</p>",
    123         "isNotice": "false",
    124         "dom": ".js-submit"
    125     }
    126     article_data_res = person.post(url="http://www.yiban.cn/forum/article/addAjax", data=article_data, headers={
    127         'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36',
    128         'Accept': 'application/json, text/javascript, */*; q=0.01',
    129         'Accept-Language': 'zh-CN,zh;q=0.9',
    130     }
    131                                    )
    132     print(article_data_res.json())
    133 
    134 
    135 # 添加投票
    136 def vote_add():  # 投票
    137     vote_data = {
    138         "puid": 自己的,
    139         "scope_ids": 自己的,
    140         "title": "换个姿势再来一次",
    141         "subjectTxt": None,
    142         "subjectPic": None,
    143         "options_num": 3,
    144         "scopeMin": 1,
    145         "scopeMax": 1,
    146         "minimum": 1,
    147         "voteValue": "2019-07-21 13:15",
    148         "voteKey": 2,
    149         "public_type": 0,
    150         "isAnonymous": 1,
    151         "voteIsCaptcha": 0,
    152         "istop": 1,
    153         "sysnotice": 2,
    154         "isshare": 1,
    155         "rsa": 1,
    156         "dom": " .js-submit",
    157         "group_id": 自己的,
    158         "subjectTxt_1": "vote1--",
    159         "subjectTxt_2": "vote2",
    160         "subjectTxt_3": "vote3"
    161     }
    162     vote_data_res = person.post(url="http://www.yiban.cn/vote/vote/add", data=vote_data, headers={
    163         'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36',
    164         'Accept': 'application/json, text/javascript, */*; q=0.01',
    165         'Accept-Language': 'zh-CN,zh;q=0.9', })
    166     print(vote_data_res.json())
    167 
    168 
    169 # http://www.yiban.cn/Newgroup/showMorePub/group_id/457740/puid/7245623/type/3/page/1
    170 # 初始化投票,评论
    171 def get_vote_url():
    172     for i in range(50):
    173         start_url = "http://www.yiban.cn/Newgroup/showMorePub/group_id/457740/puid/7245623/type/3/page/{0}".format(i)
    174         resp = person.get(url=start_url)
    175         response = Selector(resp)
    176         url_list = response.css(' .vote-itd2 a::attr(href)').extract()
    177         next_url = response.css('.pager .next::attr(href)').extract()
    178         print(next_url)  # 下一页url
    179         print(url_list)  # 整页投票url
    180         for i in url_list:
    181             vote_id = re.findall("vote_id/(.*?)/puid", i)
    182             author_id = re.findall("actor_id/(.*?)/status", i)
    183             # print(author_id)
    184             # print(vote_id)
    185             # print(type(vote_id))
    186             # vote_url = "http://www.yiban.cn{0}".format(i)
    187             # "pagetype": 2,  (1代表未过期,2代表已过期)
    188             # 提取网页过期时间, 与当前时间做对比
    189             # vote / vote / showDetail / vote_id / 54280789 / puid / 7245623 / group_id / 457740 / actor_id / 12806206 / status / 1
    190             vate_data = {
    191                 "vote_id": vote_id[0],
    192                 "uid": 自己的,
    193                 "puid": 自己的,
    194                 "pagetype": 1,
    195                 "group_id": 自己的,
    196                 "actor_id": 自己的,
    197                 "top_power": "f",
    198                 "edit_power": "f",
    199                 "end_power": "f",
    200                 "del_power": "f",
    201                 "block_power": "f",
    202                 "isSchoolVerify": 1,
    203                 "is_public": "f",
    204                 "is_anonymous": "t",
    205                 "token": "",
    206                 "out_power": "f",
    207                 "isMember": "",
    208                 "url%5BgetVoteDetail%5D": "vote%2Fvote%2FgetVoteDetail",
    209                 "url%5Boutput%5D": "%2Fvote%2FExpand%2Foutput",
    210                 "rl%5BgetCommentDetail%5D": "vote%2Fvote%2FgetCommentDetail",
    211                 "url%5BaddComment%5D": "vote%2Fvote%2FaddComment",
    212                 "url%5BeditLove%5D": "vote%2Fvote%2FeditLove",
    213                 "url%5Bvote%5D": "vote%2Fvote%2Fact",
    214                 "url%5BsetIsTop%5D": "vote%2FExpand%2FsetIsTop",
    215                 "url%5BsetManualEndVote%5D": "vote%2FExpand%2FsetManualEndVote",
    216                 "url%5BdelVote%5D": "vote%2FExpand%2FdelVote",
    217                 "url%5BdelComment%5D": "vote%2Fvote%2FdelComment",
    218                 "url%5BshieldVote%5D": "vote%2FExpand%2FshieldVote",
    219                 "url%5BgetAnonymous%5D": "vote%2FExpand%2FgetAnonymous",
    220                 "url%5BuserInfo%5D": "user%2Findex%2Findex",
    221                 "isLogin": 1,
    222                 "isOrganization": 0,
    223                 "ispublic": 0,
    224             }
    225             vote_res = person.post(url="http://www.yiban.cn/vote/vote/getVoteDetail", data=vate_data, cookies=cookies,
    226                                    headers={
    227                                        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36',
    228                                        'Accept': 'application/json, text/javascript, */*; q=0.01',
    229                                        'Accept-Language': 'zh-CN,zh;q=0.9'})
    230             response_f = vote_res.json()
    231             # print(response_f)
    232             # print(type(response_f))
    233             dict1 = response_f['data']
    234             dict_l = dict1['vote_list']
    235             dict_t = dict1['option_list']
    236             # print(dict_t)
    237 
    238             # 选取全部voptions_id 投票选项id
    239             v_list = []
    240             for i in dict_t:
    241                 v_list.append(dict(i)["id"])
    242             print(v_list)
    243 
    244             # 提取是否已投票
    245             v_list1 = []
    246             for m in dict_t:
    247                 try:
    248                     v_list1.append(dict(m)["is_vote"])
    249                 except KeyError:
    250                     pass
    251             print(v_list1)
    252 
    253             # min
    254             minimum = int(dict_l['minimum'])  # 投票数 单选or多选
    255             scopeMax = int(dict_l['scopeMax'])
    256 
    257             # mount_id
    258             mount_id = int(dict_l['mount_id'])  # 投票数 单选or多选
    259 
    260             # end_time
    261             end_time = dict_l['voteValue'] + ":00"  # 结束时间
    262 
    263             # 时间转时间戳
    264             timeArray = time.strptime(end_time, "%Y-%m-%d %H:%M:%S")  # 时间数组
    265             timeStamp = int(time.mktime(timeArray))  # 时间戳
    266             print(timeStamp)
    267             if cmp_time(int(timeStamp)) == 1 and len(v_list1) == 0:  # 判断是否过期或已投票
    268                 voptions_id = voptions_id_chiose(minimum, v_list)
    269                 vate_choise(vote_id[0], author_id[0], minimum, scopeMax, voptions_id)  # 投票
    270                 vate_comment(vote_id, author_id, mount_id)  # 评论
    271             else:
    272                 vate_comment(vote_id, author_id, mount_id)
    273 
    274 
    275 # def vote_chenge(next_url):
    276 #     if next_url:
    277 #         next_url ="{0}next_url".format("www.yiban.cn/")
    278 #     else:
    279 #         brack
    280 #     ret
    281 
    282 
    283 # 判断多选or单选
    284 def voptions_id_chiose(minimum, v_list):
    285     import random
    286     if minimum == 1:
    287         voptions_id = []
    288         i = random.randint(0, minimum)
    289         voptions_id.append(v_list[i])
    290         voptions_id1 = [str(i) for i in voptions_id]  # 遍历各元素使之成为字符元素
    291         str_voptions_id = "".join(voptions_id1)
    292         # 单选
    293     else:
    294         n = len(v_list)
    295         m = random.sample(range(0, n), minimum)
    296         voptions_id = []
    297         for i in m:
    298             voptions_id.append(v_list[i])
    299         print(voptions_id)
    300         voptions_id1 = [str(i) for i in voptions_id]  # # 遍历各元素使之成为字符元素
    301         str_voptions_id = ",".join(voptions_id1)
    302         # 多选
    303     return str_voptions_id
    304 
    305 
    306 # 判断投票是否过期
    307 def cmp_time(end_time):
    308     n_time = time.time()
    309     pagetype = 1
    310     if int(n_time) > end_time:
    311         pagetype = 2
    312     return pagetype
    313 
    314 
    315 # 选择投票
    316 def vate_choise(vote_id, author_id, minimum, scopeMax, voptions_id):
    317     vate_data = {
    318         "puid": 自己的,
    319         "group_id": 自己的,
    320         "vote_id": vote_id,
    321         "actor_id": author_id,
    322         "voptions_id": voptions_id,
    323         "minimum": minimum,
    324         "scopeMax": scopeMax,
    325     }
    326     res = person.post(url="http://www.yiban.cn/vote/vote/act", data=vate_data, cookies=cookies,
    327                       headers={
    328                           'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36',
    329                           'Accept': 'application/json, text/javascript, */*; q=0.01',
    330                           'Accept-Language': 'zh-CN,zh;q=0.9'})
    331     print(res.json())
    332 
    333 
    334 # 投票评论
    335 def vate_comment(vote_id, author_id, mount_id):
    336     comment_data = {
    337         "mountid": mount_id,
    338         "msg": "换个姿势再来一次",
    339         "group_id": 自己的,
    340         "actor_id": 自己的,
    341         "vote_id": vote_id,
    342         "author_id": author_id,
    343         "puid": 自己的,
    344         "reply_comment_id": 0,
    345         "reply_user_id": 0,
    346     }
    347     res = person.post(url="http://www.yiban.cn/vote/vote/addComment", data=comment_data, cookies=cookies,
    348                       headers={
    349                           'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36',
    350                           'Accept': 'application/json, text/javascript, */*; q=0.01',
    351                           'Accept-Language': 'zh-CN,zh;q=0.9'})
    352     print(res.json())
    353 
    354 
    355 # http://www.yiban.cn/vote/vote/getVoteDetail
    356 import threading
    357 if __name__ == '__main__':
    358     login(user, password)
    359     [vote_add() for i in range(20)]
    360     for _ in range(30):
    361         # t1 = threading.Thread(target=vote_add)
    362         # t2 = threading.Thread(target=article_add)
    363         t3 = threading.Thread(target=get_vote_url)
    364         # t1.start()
    365         # t2.start()
    366         t3.start()
    -------------------------------------------------注解 注解 注解--------------------------------------------------

    注:易班post提交数据{
         "account": user,
    "password": rsa_pass, 加密了  rsa加密 审查源码发现公钥在源码内,pycryptodemo按照易班的方式加密在提交(之请搞得我头痛,参照http://www.cnblogs.com/RealMaang/articles/10071602.html
    "captcha": check_in, 验证码  这个没得办法,只有下载到本地人工读取(貌似google有一款图片识别,但是效率低)
    "keysTime": keys_time 时间戳 差毫秒就会登录超时(提取网页内的时间戳完美,用time.time()我试了好多次都不行)
    }
    暂时文章投票只能发二十条,然后就是验真码了,我试了time.sleep(1) 显然易班不是这个机制
    未完待续...
    邮箱:bigmaxgod@qq.com
    转载注明出处:https://www.cnblogs.com/jum-bolg/p/10792853.html
    
    
  • 相关阅读:
    自定义瀑布流
    传值 属性 block 单例 协议
    sqlite数据库中 保存和读取UIData对象
    SQL
    关于在Xcode控制台打印的注意点
    synthesize的作用
    iPhone屏幕尺寸/launch尺寸/icon尺寸
    关于TableView上有一段留白的解决方法
    mac显示隐藏文件
    多线程之GCD
  • 原文地址:https://www.cnblogs.com/jum-bolg/p/10792853.html
Copyright © 2011-2022 走看看