Skip to content

Commit 98c6b1d

Browse files
authored
1.0.0 - Primeira versão funcional from MarkusLuan/markus
1.0.0 - Primeira versão funcional
2 parents 6404f66 + 654eb76 commit 98c6b1d

File tree

20 files changed

+1102
-58
lines changed

20 files changed

+1102
-58
lines changed

comentario.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import instagram
2+
from flask import request, redirect, render_template
3+
import json
4+
5+
class Comentario:
6+
def __init__(self, app, login, stream):
7+
self.__login = login
8+
self.__stream = stream
9+
self.rotas(app)
10+
11+
def rotas(self, app):
12+
@app.route("/comentarios", methods=["GET"])
13+
def getComentarios():
14+
lastComent = request.args.get("lastComent")
15+
16+
ComentarioMgr = instagram.ComentarioMgr(instagram.getSession)
17+
18+
comentarios = ComentarioMgr.getComentarios(self.__stream.value, lastComent)
19+
if (len(comentarios) > 0):
20+
if (len(comentarios["comentarios"]) > 0):
21+
print("Novos comentários")
22+
23+
return json.dumps(comentarios)
24+
25+
@app.route("/comentarios/enviar", methods=["POST"])
26+
def enviarComentario():
27+
comentario = request.form.get("comentario")
28+
if comentario is None:
29+
raise Exception("Erro: Comentário Invalido!")
30+
31+
ComentarioMgr = instagram.ComentarioMgr(instagram.getSession)
32+
comentario = ComentarioMgr.comentar(self.__stream.value, comentario)
33+
return json.dumps(comentario)
34+
35+
@app.route("/comentarios/alternar", methods=["POST"])
36+
def alternarComentario():
37+
ocultar = request.form.get("ocultar")
38+
if ocultar is None:
39+
raise Exception("Erro: Comentário Invalido!")
40+
41+
ocultar = (ocultar!="false")
42+
43+
ComentarioMgr = instagram.ComentarioMgr(instagram.getSession)
44+
45+
if ocultar:
46+
ComentarioMgr.ocultarComentarios(self.__stream.value)
47+
print("Comentarios desativados!")
48+
else:
49+
ComentarioMgr.exibirComentarios(self.__stream.value)
50+
print("Exibindo comentarios!")
51+
return str(ocultar)

instagram/__init__.py

Lines changed: 59 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,74 @@
1-
from .stream import Stream
1+
from .constants import Constants
22
import requests
3+
from flask import request
34

4-
#https://i.instagram.com/api/v1/live/" + live_id+ "/get_comment/?last_comment_ts=0
5-
#https://i.instagram.com/api/v1/live/" + live_id+ "/get_final_viewer_list/
5+
def getSession():
6+
session = requests.Session()
7+
session.headers = {
8+
"user-agent" : Constants.USER_AGENT,
9+
"Referer" : "https://i.instagram.com/"
10+
}
611

7-
URL = "https://www.instagram.com/"
8-
USER_AGENT = "Mozilla/5.0 (Linux; Android 7.0; Moto C Plus; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/80.0.3987.99 Mobile Safari/537.36 Instagram 139.0.0.33.121 Android (24/7.0; 294dpi; 720x1280; moto; Moto C Plus; Moto C Plus; qcom; pt_BR)"
12+
def atualizarCSRFToken(token):
13+
if token is None:
14+
return
15+
16+
session.headers.update({"X-CSRFToken": token})
17+
return token
918

10-
session = requests.Session()
11-
session.headers = {
12-
"user-agent" : USER_AGENT,
13-
"Referer" : URL
14-
}
19+
session.atualizarCSRFToken = atualizarCSRFToken
20+
session.atualizarCSRFToken(request.cookies.get("csrf_token"))
21+
22+
cookies = request.cookies.to_dict()
23+
for c in cookies:
24+
if c.startswith("i."):
25+
cookie = requests.cookies.create_cookie(c[2:], cookies[c], domain=".instagram.com")
26+
session.cookies.set_cookie(cookie)
1527

16-
def atualizarCSRFToken(session, token):
17-
session.headers.update({"X-CSRFToken": token})
28+
return session
1829

19-
def fazerLogin(usuario, senha):
20-
print("Fazendo login no instagram @%s...." % usuario)
30+
from .login import LoginMgr
31+
from .comentario import ComentarioMgr
32+
from .stream import Stream
33+
from .model.usuario import Usuario
2134

22-
req = session.get(URL)
23-
atualizarCSRFToken(session, req.cookies["csrftoken"])
35+
def getJoinRequests(self, stream, last_joinRequest):
36+
session = getSession()
2437

25-
req = session.post(URL + "accounts/login/ajax/", data={
26-
"username": usuario,
27-
"password": senha
38+
req = session.get("https://i.instagram.com/api/v1/live/" + stream.id+ "/get_join_request_counts/", data={
39+
"last_seen_ts": last_joinRequest,
40+
"last_fetch_ts": last_joinRequest
2841
})
2942
res = req.json()
30-
atualizarCSRFToken(session, req.cookies["csrftoken"])
3143

32-
if res["status"] != "ok" or res["authenticated"] != True:
33-
raise Exception("Erro no login: %s" % res)
44+
joinRequests = []
45+
j_dt_envio = res["fetch_ts"]
46+
if (j_dt_envio is None) or (int(j_dt_envio) <= int(last_joinRequest)):
47+
return joinRequests
48+
49+
if res["users"]:
50+
for j in res["users"]:
51+
u_id = j["pk"]
52+
u_nome = j["username"]
53+
u_img = j["profile_pic_url"]
3454

35-
print("Logado com sucesso!")
36-
print()
55+
usuario = Usuario(u_id, u_nome, u_img)
56+
joinRequests.append(usuario.toJson())
57+
58+
return joinRequests
3759

38-
def getJoinRequests():
39-
req = session.get("https://i.instagram.com/api/v1/live/" + live_id+ "/get_join_request_counts/", data={
40-
"last_total_count": 0,
41-
"last_seen_ts": 0,
42-
"last_fetch_ts": 0
43-
})
60+
def getStream(criarStream=True):
61+
try:
62+
stream = Stream(getSession, criarStream)
63+
return stream
64+
except Exception as e:
65+
print(e)
66+
return None
67+
68+
def getInfo(stream):
69+
session = getSession()
70+
71+
req = session.post("https://i.instagram.com/api/v1/live/" + stream.id + "/heartbeat_and_get_viewer_count/")
4472
res = req.json()
45-
print(res)
46-
print()
4773

48-
def getStream():
49-
stream = Stream(session)
50-
return stream
74+
return res

instagram/comentario.py

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
from flask import request
2+
3+
from .model.usuario import Usuario
4+
from .model.comentario import Comentario
5+
from .constants import Constants
6+
7+
class ComentarioMgr:
8+
def __init__(self, getSession):
9+
self.__session = None
10+
self.__getSession = getSession
11+
12+
def getComentarios(self, stream, last_comment):
13+
self.__session = self.__getSession()
14+
self.__session.headers.update({"X-CSRFToken": request.cookies.get("csrf_token")})
15+
16+
req = self.__session.get("https://i.instagram.com/api/v1/live/" + stream.id+ "/get_comment/", data={
17+
"last_comment_ts" : last_comment
18+
})
19+
res = req.json()
20+
21+
if res["status"] != "ok":
22+
return []
23+
24+
ativo = not bool(res["comment_muted"])
25+
comentarios = []
26+
27+
if ativo and res["comments"] is not None:
28+
for c in res["comments"]:
29+
c_id = c["pk"]
30+
c_dt_envio = c["created_at"]
31+
c_texto = c["text"]
32+
33+
u = c["user"]
34+
u_id = u["pk"]
35+
u_nome = u["username"]
36+
u_img = u["profile_pic_url"]
37+
38+
if (int(c_dt_envio) <= int(last_comment)):
39+
continue
40+
41+
usuario = Usuario(u_id, u_nome, u_img)
42+
comentario = Comentario(c_id, c_dt_envio, c_texto, usuario)
43+
44+
comentarios.append(comentario.toJson())
45+
46+
if ativo and res["system_comments"] is not None:
47+
for c in res["system_comments"]:
48+
c_id = c["pk"]
49+
c_dt_envio = c["created_at"]
50+
c_texto = c["text"].replace("joined", "entrou")
51+
52+
u = c["user"]
53+
u_img = u["profile_pic_url"]
54+
55+
if (int(c_dt_envio) <= int(last_comment)):
56+
continue
57+
58+
usuario = Usuario("", "", u_img)
59+
comentario = Comentario(c_id, c_dt_envio, c_texto, usuario)
60+
61+
comentarios.append(comentario.toJson())
62+
63+
return {
64+
"comentarios": comentarios,
65+
"ativo": ativo
66+
}
67+
68+
def ocultarComentarios(self, stream):
69+
self.__session = self.__getSession()
70+
self.__session.headers.update({"X-CSRFToken": request.cookies.get("csrf_token")})
71+
72+
req = self.__session.post("https://i.instagram.com/api/v1/live/" + stream.id + "/mute_comment/")
73+
res = req.json()
74+
return res
75+
76+
def exibirComentarios(self, stream):
77+
self.__session = self.__getSession()
78+
self.__session.headers.update({"X-CSRFToken": request.cookies.get("csrf_token")})
79+
80+
req = self.__session.post("https://i.instagram.com/api/v1/live/" + stream.id + "/unmute_comment/")
81+
res = req.json()
82+
return res
83+
84+
def comentar(self, stream, texto):
85+
self.__session = self.__getSession()
86+
self.__session.headers.update({"X-CSRFToken": request.cookies.get("csrf_token")})
87+
88+
req = self.__session.post("https://i.instagram.com/api/v1/live/" + stream.id + "/comment/", data={
89+
"comment_text": texto,
90+
"live_or_vod": 1,
91+
"offset_to_video_start": 0,
92+
"idempotence_token": Constants.DEVICE
93+
})
94+
res = req.json()
95+
96+
return res

instagram/constants.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import uuid
2+
3+
class Constants:
4+
"""Baseado no código da api privada do instagram
5+
https://github.com/ping/instagram_private_api/tree/master/instagram_private_api
6+
"""
7+
8+
APP_VERSION = '76.0.0.15.395'
9+
10+
ANDROID_VERSION = 24
11+
ANDROID_RELEASE = '7.0'
12+
PHONE_MANUFACTURER = 'motorola'
13+
PHONE_DEVICE = 'Moto C Plus'
14+
PHONE_MODEL = 'panell_23_dl'
15+
PHONE_DPI = '240dpi'
16+
PHONE_RESOLUTION = '720x1280'
17+
PHONE_CHIPSET = 'mt6737'
18+
VERSION_CODE = '138226743'
19+
20+
USER_AGENT_FORMAT = \
21+
"Mozilla/5.0 (Linux; Android {android_release}; {device}; wv) " \
22+
"AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 " \
23+
"Chrome/80.0.3987.99 Mobile Safari/537.36 " \
24+
"Instagram {app_version} Android ({android_version:d}/{android_release}; " \
25+
"{dpi}; {resolution}; {brand}; {device}; {model}; {chipset}; en_US; {version_code})"
26+
27+
USER_AGENT = USER_AGENT_FORMAT.format(**{
28+
'app_version': APP_VERSION,
29+
'android_version': ANDROID_VERSION,
30+
'android_release': ANDROID_RELEASE,
31+
'brand': PHONE_MANUFACTURER,
32+
'device': PHONE_DEVICE,
33+
'model': PHONE_MODEL,
34+
'dpi': PHONE_DPI,
35+
'resolution': PHONE_RESOLUTION,
36+
'chipset': PHONE_CHIPSET,
37+
'version_code': VERSION_CODE})
38+
39+
DEVICE = uuid.uuid1()
40+
ANDROID_DEVICE = "android:%s" % DEVICE

0 commit comments

Comments
 (0)