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-----\nM' + 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