Commit ea5bb7ba authored by Tanguy's avatar Tanguy

Facebook client + harvester, and drive exporter

parent 91e45f67
File added
No preview for this file type
...@@ -3,4 +3,4 @@ import sqlite3 ...@@ -3,4 +3,4 @@ import sqlite3
bq = BeequickClient.admin() bq = BeequickClient.admin()
print(bq.getAllEtudes()) print(bq.getAllEtudes()[0])
\ No newline at end of file \ No newline at end of file
from __future__ import print_function
import os.path
from google.auth.transport.requests import Request
from google.oauth2 import service_account
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
import sqlite3
con = sqlite3.connect("../CNE.db")
db = con.cursor()
values = db.execute("SELECT * FROM fb_posts").fetchall()
s1 = len(values) + 1
SCOPES = ['https://www.googleapis.com/auth/spreadsheets']
SPREADSHEET_ID = '1Rf_AmrKNkol--kKtWYJLHVYzL1ffTcpSjfuaSahRZx0'
creds = service_account.Credentials.from_service_account_file('token.json', scopes = SCOPES)
try:
service = build('sheets', 'v4', credentials=creds)
sheet = service.spreadsheets()
body = { "values" : values }
result = sheet.values().update(
spreadsheetId = SPREADSHEET_ID,
range = "A2:N" + str(s1),
valueInputOption = "USER_ENTERED",
body = body
).execute()
print(result)
except HttpError as err:
print(err)
{
"type": "service_account",
"project_id": "cnexporter",
"private_key_id": "2c4076dbd90d1fcde40bcaa4d74782553b7e392f",
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCMaYgJlL0l58zh\nwg9dNbf7CHZqqakswyl3oJg7W8D5loJWKehyu2xyT8AWdj7U1hh3VKkDYIYi2URj\nkVgN1JbGFgoDtpSuH5N6GO4OzQzVxMOqVZrVbh5EZZZxyT8TnLa4JICM8L66ai0b\nooGLjXGL+722JrkBNlfCyrgbjbn7fXNs08gjmmmgYQT5nQ3huxmY1XaLnYc75XaG\n56gb1/z27A34cDQfYBLHeSWhLAtw2Caf/Kv/7zDJIgiilZ38relTI5EJnt1Cd1vp\naVZNZSqc/4RLQ5IcufxGysm/t4Zj+j/kFCh1P6rrCAxDWXBU9PzgGmEHL3+cT6OT\n1/4rkyGVAgMBAAECggEACZdk3kitggMbTPmZXJPgkTKTCja0MnVTZhNPitB59mKo\nXRPoR7wTTJyzgaVKpfXI/o/HKs6jYwqF4CpLwkgZE4dqYDYO4nUQOSkuS88IdyrF\ndeN6m+U1hpUM6ZFmcGPGXH5L1LTWRnwdwDNB16NOFBKaczCidxl79besy18LSwk9\nG9hN+HLb6V6ITrz5sbBf4/i0pB1pkrX18qOSQe6JH0XlvwRCMUe61YH5gEVyN8pY\nijyK3O0NonwAhCK3PSr2wxCkGnrrVkQFv1BtuoltKr7OAZMnn8yBgZ6IzX2SjFXx\n0dHRtcJtFgPdpV5jbeHtnEKqj/Xrhf6Z5unRYeqQiQKBgQC/D0bOaruskFcIYR1t\nBdYBZvYuEaJKpiGZGREssK4gVvG7U49SW6QF4AvJ/BxvmyVlSgvspX8UV7W3G6ef\nDivhC1huVStMER3zHnP1c9QE65cHg5yMszf5lNEF1SITGoxA6KV3/T/cd6pLfl/b\noUNq7ZN40ekZIWNZp9DlOzWnCQKBgQC8I0GWpmxvXVr+FNC/ixNAhMFiMOzjDk7J\nBdjVJAJqc/ktlEfJlnLyr4pZlhw7mCK7WvB4XFgXGBuPUjiV7v8n290U8fOvUX6x\nWtMCEZzxs95jHGtENATNYMHbltguqBWff287G5E4hERW82DIFLNi2GRoDP1ZJZUh\npiobHOLdLQKBgBTtDWpKUmfiH0YxrNFmFDxvFIOTNt1KON/V2QW2DDxKiYtk6Yux\nsdNa6K+kx1CKA5yGcavnrHWD7ckyZDeNi8zIO1VKSsW4Ejmwmi7GEvC/BPmzto/K\niVTysbobz/GbtMTfNlBgEoCJMsO2AbXCgenSP5a6FvfDqmgFc2HIDGZRAoGAaM6H\nMkKB88Qg9Zxo8durHO0XwfiZbp/A2hGsyofl5KG4tWB+YVmzrWiG/QM3tSc6af7u\nKU7gL/VZHQ1jwnrCn9TGo21qIEeY+XosRGHFeYyHHdVuGC+WYUc+l3K/+bXfXdwi\n/d2Ml9xvKbUpPCz0BeOgg6qA1FGwc29a04HTC/0CgYBOhuablvCxpc9X2Oyv8GLi\n+B8AgBUtduZKcvGnk2NrTg+8DRvKJMq8pAsYua9d19T+G3TFR+ct5Qs/vkCx9vwq\nubckTUXAs8ZhdSNM9Tq7oBDD+c2PSCAhIuljhKgcwOLrqasLUKdxzt6+k9VIPHsi\naoFcsimlOg69M0+lro2K4A==\n-----END PRIVATE KEY-----\n",
"client_email": "cnexporter@cnexporter.iam.gserviceaccount.com",
"client_id": "103850134823541861582",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/cnexporter%40cnexporter.iam.gserviceaccount.com"
}
import requests
DOMAIN = "https://graph.facebook.com/"
VERSION = "v12.0"
PAGE_ID = "174446955950478"
TOKEN = "EAARMLPVll60BAHp1DOcT8ZB8dMuU1vffOSloY3CSIZC0pPdwUW62vLZBu59R9Iz5eCcT9nxvAO0MKJSND82gCvK4RVw2JFBd5HXfdnxZBSpCbkuRPFkQ6e5BeHANpzVK1qHhKnQA190NGeQWJ66lmLbQlgkVoDLJE8wcExbSgfiPndTewlQk"
class FacebookClient:
def __init__(self, page_id = 'me', token = TOKEN, version = VERSION):
self.token = token
self.version = version
self.page_id = page_id
self.url = DOMAIN + self.version + "/"
def getFields(self, id = "me", fields = []):
values = ",".join(fields)
params = {"fields":values}
return self.get(id, params)
def getInsights(self, id = "me", metrics = []):
values = ",".join(metrics)
params = {"metric":values}
return self.get(id + "/insights", params)["data"]
def get(self, url, params):
params.update({"access_token":self.token})
return requests.get(self.url + url, params).json()
def getPosts(self, params = {"limit":100,"pretty":0}):
res = self.get(self.page_id + "/posts", params)
data = []
data += res["data"]
while "next" in res["paging"]:
n_url = res["paging"]["next"]
res = requests.get(n_url).json()
data += res["data"]
print("Next page !")
print(len(data))
return data
#curl -i -X GET \
# "https://graph.facebook.com/v12.0/174446955950478_4147730755288725/insights?metric=post_reactions_like_total%2Cpost_reactions_love_total%2Cpost_reactions_wow_total&access_token=EAARMLPVll60BAEIpWngGBZAZAr5w1iRgMhD2baT7DmO2Ts9j7ZBUpIAxUFvH2R3dmsdAvxHF9J3lEa53STf5rYY1uXV5XFl5VdobXVZBbtgTRj0aQ6P0DrjNkUZCkW2ZAOVCR7cGQHHZBiyQumh3KY6mhwZCudvxEoOpAbxvvlxCZAUB0lt2n7fiW"
\ No newline at end of file
from FacebookClient import FacebookClient
import sqlite3
con = sqlite3.connect("../CNE.db")
db = con.cursor()
fb = FacebookClient()
posts = fb.getPosts()
reactions = ["like","wow","love","haha","sorry","anger"]
metrics = [
"post_impressions",
"post_impressions_unique",
"post_engaged_users"
]
for r in reactions:
metrics.append("post_reactions_" + r + "_total")
insert_req = "INSERT INTO fb_posts" \
"(fb_id, created_at, impressions, impressions_unique, " \
"reactions_like, reactions_wow, reactions_love, " \
"reactions_haha, reactions_sorry, reactions_anger, " \
"engaged_users, message, story) " \
"VALUES ( :fb_id, :created_at, :impressions, :impressions_unique, " \
":reactions_like, :reactions_wow, :reactions_love, " \
":reactions_haha, :reactions_sorry, :reactions_anger, " \
":engaged_users, :message, :story) "
update_req = "UPDATE fb_posts " \
"SET fb_id = :fb_id, created_at = :created_at, impressions = :impressions, impressions_unique = :impressions_unique, " \
"reactions_like = :reactions_like, reactions_wow = :reactions_wow, reactions_love = :reactions_love, " \
"reactions_haha = :reactions_haha, reactions_sorry = :reactions_sorry, reactions_anger = :reactions_anger, " \
"engaged_users = :engaged_users, message = :message, story = :story " \
"WHERE fb_id = :fb_id"
for post in posts:
fb_id = post["id"]
insights = fb.getInsights(fb_id, metrics)
results = {}
for metric in insights:
value = metric["values"][0]["value"]
results.update({metric["name"]:value})
message = post["message"] if ("message" in post) else None
story = post["story"] if ("story" in post) else None
data = {
"fb_id": fb_id,
"created_at": post["created_time"],
"impressions": results["post_impressions"],
"impressions_unique": results["post_impressions_unique"],
"engaged_users":results["post_engaged_users"],
"message":message,
"story":story
}
for r in reactions:
data.update({"reactions_" + r : results["post_reactions_"+r+"_total"]})
already = db.execute("SELECT * FROM fb_posts WHERE fb_id = :fb_id", {"fb_id":fb_id}).fetchall()
req = insert_req if len(already) == 0 else update_req
db.execute(req,data)
print(data)
con.commit()
con.close()
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment