forked from actlaboratory/TCV
-
Notifications
You must be signed in to change notification settings - Fork 0
/
twitterLogin.py
67 lines (55 loc) · 2.48 KB
/
twitterLogin.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# NPC Twitter login module
# Copyright (C) 2021 yamahubuki <[email protected]>
import errorCodes
import requests
import urllib.parse
from bs4 import BeautifulSoup
def getToken(session):
page = session.get("https://peing.net/ja/",timeout=5)
soup = BeautifulSoup(page.content, "lxml")
form = soup.find("form", {"action":"/auth/twitter"})
ret = form.find("input", {"name":"authenticity_token","type":"hidden"})
return ret["value"]
def login(id, password):
session = requests.Session()
#STEP1: referer対策のためのリクエスト
# STEP1: Refeler対策のため、トップページへダミーアクセス
ret = session.get("https://twitcasting.tv/",timeout=5)
if ret.status_code!=200:
return errorCodes.LOGIN_TWITCASTING_ERROR
#STEP2: Twitterのログインページへジャンプ
ret = session.get("https://twitcasting.tv/?goauth=1&b=%2F&keep=1",timeout=5)
if not ret.url.startswith("https://api.twitter.com/oauth/authenticate?"):
return errorCodes.LOGIN_TWITCASTING_ERROR
#STEP3: 取得したページを解析して次のリクエストを生成
soup = BeautifulSoup(ret.content, "lxml")
headers = {}
data = {
"authenticity_token": soup.find("input", {"name":"authenticity_token","type":"hidden"})["value"],
"redirect_after_login": soup.find("input", {"name":"redirect_after_login","type":"hidden"})["value"],
"oauth_token": soup.find("input", {"name":"oauth_token","type":"hidden"})["value"],
"session[username_or_email]": id,
"session[password]": password
}
#STEP4: ログインリクエスト
ret = session.post("https://api.twitter.com/oauth/authenticate",headers=headers,data=data,timeout=5)
if ret.url.startswith("https://twitter.com/login/error?"):
return errorCodes.LOGIN_TWITTER_WRONG_ACCOUNT
elif ret.url.startswith("https://twitter.com/account/access") or ret.url.startswith("https://twitter.com/login"):
return errorCodes.LOGIN_RECAPTCHA_NEEDED
elif not ret.url.startswith("https://api.twitter.com/oauth/authenticate"):
return errorCodes.LOGIN_TWITTER_ERROR
#STEP5: 戻り先URLの取得
try:
soup = BeautifulSoup(ret.content, "lxml")
url = soup.find("meta",{"http-equiv":"refresh"})["content"][6:]
except:
return errorCodes.LOGIN_CONFIRM_NEEDED
if not url.startswith("https://twitcasting.tv/?"):
return errorCodes.LOGIN_TWITTER_ERROR
#STEP6: 戻り先URLへアクセス
ret = session.get(url)
print(ret.url)
if not ret.url.startswith("https://twitcasting.tv/") or len(ret.history)!=1:
return errorCodes.LOGIN_TWITCASTING_ERROR
return session