tools/hateserv/api.py

113 lines
4.9 KiB
Python

#!/usr/bin/env python
# hateserv irc bot - developed by acidvegas in python (https://git.acid.vegas/hateserv)
import http.client
import json
import re
import urllib.parse
from googleapiclient.discovery import build # https://pypi.org/project/google-api-python-client/
#import tweepy # https://pypi.org/project/tweepy/
# API Keys
google_api_key = 'redacted' # https://console.developers.google.com/
google_cse_id = 'redacted' # https://cse.google.com/
twitter_bearer_token = 'redacted'
twitter_access_token = 'redacted'
twitter_access_token_secret = 'redacted'
twitter_client_id = 'redacted'
twitter_client_secret = 'redacted'
twitter_api_key = 'redacted'
twitter_api_secret = 'redacted'
def between(source, start, stop):
data = re.compile(start + '(.*?)' + stop, re.IGNORECASE|re.MULTILINE).search(source)
return data.group(1) if data else False
def geturl(url, endpoint, headers={}):
conn = http.client.HTTPSConnection(url, timeout=15)
conn.request('GET', endpoint, headers=headers)
response = conn.getresponse().read()
conn.close()
return response
def google(query):
service = build('customsearch', 'v1', developerKey=google_api_key, cache_discovery=False).cse()
results = service.list(q=query, cx=google_cse_id, num=10).execute()
return results['items'] if results else False
def netsplit(option, query):
if option == 'channels':
data = str(geturl('netsplit.de', '/channels/?chat='+query))
for i in ('&#8203;','<b>','</b>','<span style="color:#000000;">','<strong>','</strong>','<span class="cs-no-topic">'):
data = data.replace(i, '')
results = re.findall('<div class="cs-result">(.*?)</div>', data, re.IGNORECASE|re.MULTILINE)
if results:
channels = list()
for item in results:
channel = between(item, '<span class="cs-channel">', '</span>')
network = between(item, '<span class="cs-network">', '</span>')
users = between(item, ' - ', ' users - ')
if '<span class="cs-details">current topic:' in item:
topic = between(item, '<span class="cs-details">current topic:&nbsp;</span>', '<br>').replace('</span>','')
else:
topic = 'no topic set for channel'
channels.append({'channel':channel, 'network':network, 'users':users, 'topic':topic})
return channels
else:
return False
elif option == 'networks':
data = str(geturl('netsplit.de', '/networks/'))
results = re.findall('<a class="competitor" href="/networks/(.*?)/" title=', data, re.IGNORECASE|re.MULTILINE)
return results if results else False
def reddit(option, subreddit, id=None):
if option == 'post':
data = json.loads(geturl('www.reddit.com', f'/r/{subreddit}/comments/{id}.json', headers={'Accept':'application/json','User-Agent':'HateServ/1.0'}))
return data[0]['data']['children'][0]['data'] if 'error' not in data else False
elif option == 'subreddit':
data = json.loads(geturl('www.reddit.com', f'/r/{subreddit}.json?limit=20', headers={'Accept':'application/json','User-Agent':'HateServ/1.0'}))
posts = [item['data'] for item in data['data']['children'] if not item['data']['stickied']]
return posts[:10] if posts else None
def github(option, query):
if option == 'search':
data = json.loads(geturl('api.github.com', '/search/repositories?q='+query, headers={'Accept':'application/vnd.github.v3+json','User-Agent':'HateServ/1.0'}))
return data['items'][:10] if data['items'] else False
elif option == 'repo':
return json.loads(geturl('api.github.com', '/repos/'+query, headers={'Accept':'application/vnd.github.v3+json','User-Agent':'HateServ/1.0'}))
elif option == 'user':
return json.loads(geturl('api.github.com', '/users/'+query, headers={'Accept':'application/vnd.github.v3+json','User-Agent':'HateServ/1.0'}))
def youtube(option, query, api_key):
if option == 'video':
api = httplib.get_json(f'https://www.googleapis.com/youtube/v3/videos?key={config.api.google_api_key}&part=snippet,statistics&id={id}')
if api['items']:
api = api['items'][0]
data = {}
data['channel'] = api['snippet']['channelTitle']
data['description'] = ' '.join(api['snippet']['description'].split())
data['dislikes'] = api['statistics']['dislikeCount']
data['likes'] = api['statistics']['likeCount']
data['title'] = api['snippet']['title']
data['views'] = api['statistics']['viewCount']
return data
else:
return False
elif option == 'search':
service = build('youtube', 'v3', developerKey=api_key).search()
results = service.list(part='id', type='video', q=query, maxResults=10).execute()
return results['items'] if results else False
def twitter(data):
# auth = tweepy.OAuthHandler(twitter_consumer_key, twitter_consumer_secret)
# auth.set_access_token(twitter_access_token, twitter_access_secret)
# api = tweepy.API(auth)
# api.update_status(data)
pass
def unreal():
pass
def anope():
pass