# -*- coding: utf-8 -*-
import os
import re
import time
import json
import logging
import platform
import urllib
from selenium import webdriver
import telegram
from telegram.error import NetworkError, Unauthorized
from pymongo import MongoClient
import ingrex
Debug = True
bot = None
BOT_TOKEN = ''
CHANNEL_NAME = ''
Email = ''
Passwd = ''
PhantomjsPath = ''
LOG_FILENAME = 'voh.log'
logging.basicConfig(level = logging.DEBUG,
filename = LOG_FILENAME,
filemode='w')
console = logging.StreamHandler()
console.setLevel(logging.INFO)
# set a format which is simpler for console use
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
# tell the handler to use this format
console.setFormatter(formatter)
# add the handler to the root logger
logging.getLogger('').addHandler(console)
class CookieException(Exception):
''' CookieError '''
def getTime():
return time.strftime('%x %X %Z')
def readConfig():
global Email
global Passwd
global BOT_TOKEN
global CHANNEL_NAME
global PhantomjsPath
configfile = open("./config.json")
config = json.load(configfile)
Email = config["Email"]
Passwd = config["Passwd"]
BOT_TOKEN = config["BOT_TOKEN"]
CHANNEL_NAME = config["CHANNEL_NAME"]
osname = platform.system()
if osname == "Windows":
PhantomjsPath = 'C:\\Users\\LuciaHydrion\\AppData\\Roaming\\npm\\phantomjs.cmd'
elif osname == "Linux":
PhantomjsPath = '/home/clarkzjw/code/phantomjs-2.1.1-linux-i686/bin/phantomjs'
os.environ['TZ'] = 'Asia/Shanghai'
time.tzset()
def fetchCookie():
global Debug
global Email
global Passwd
global PhantomjsPath
logger = logging.getLogger('fetchCookie')
logger.info(getTime() + ': Fetching Cookie...')
driver = webdriver.PhantomJS(PhantomjsPath)
driver.get('https://www.ingress.com/intel')
# get login page
link = driver.find_elements_by_tag_name('a')[0].get_attribute('href')
driver.get(link)
if Debug:
driver.get_screenshot_as_file('1.png')
# simulate manual login
driver.set_page_load_timeout(10)
driver.set_script_timeout(20)
driver.find_element_by_id('Email').send_keys(Email)
if Debug:
driver.get_screenshot_as_file('2.png')
driver.find_element_by_css_selector('#next').click()
time.sleep(3)
driver.find_element_by_id('Passwd').send_keys(Passwd)
if Debug:
driver.get_screenshot_as_file('3.png')
driver.find_element_by_css_selector('#signIn').click()
time.sleep(3)
if Debug:
driver.get_screenshot_as_file('3.png')
# get cookies
temp = driver.get_cookies()
csrftoken = ''
SACSID = ''
for a in temp:
if (a['name'] == 'csrftoken'):
csrftoken = a['value']
if (a['name'] == 'SACSID'):
SACSID = a['value']
if csrftoken == '' or SACSID == '':
logger.error(getTime() + ': Fetch Cookie Failed')
raise CookieException
with open('cookie', 'w') as file:
cookie = 'SACSID='+SACSID+'; csrftoken='+csrftoken+'; ingress.intelmap.shflt=viz; ingress.intelmap.lat=29.098418372855484; ingress.intelmap.lng=119.81689453125; ingress.intelmap.zoom=17'
file.write(cookie)
driver.quit()
logger.info(getTime() + ': Fetching Cookie Succeed')
return True
def sendMessge(bot, msg):
"sendMsg"
logger = logging.getLogger('sendMessage')
while True:
try:
url = 'https://api.telegram.org/bot'
url += BOT_TOKEN
url += '/sendMessage?chat_id='
url += CHANNEL_NAME
url += '&text='
url += urllib.parse.quote(msg)
req = urllib.request.Request(url, headers={'Content-Type': 'application/x-www-form-urlencoded'})
resp = urllib.request.urlopen(req)
data = resp.read()
#bot.sendMessage(chat_id=CHANNEL_NAME, text=msg)
logger.info(getTime() + ": sendMsg " + msg)
break
except NetworkError:
time.sleep(1)
def sendMonitor(bot, msg):
logger = logging.getLogger('sendMonitor')
while True:
try:
bot.sendMessage(chat_id="@voamonitor", text=msg)
logger.info(getTime() + ": sendMsg " + msg)
break
except NetworkError:
time.sleep(1)
def formatMessage(raw):
pattern = re.compile('xmps.biz|enl.sh|ingressfarm.com|Polygon')
match = pattern.search(str(raw))
if match:
return "Blocked"
msg = ''
plext = raw[2]['plext']
markup = plext['markup']
plaintext = plext['text']
for mark in markup:
if mark[0] == 'SECURE':
msg += mark[1]['plain']
elif mark[0] == 'SENDER':
player = mark[1]['plain']
team = mark[1]['team']
pattern = re.compile(':')
match = pattern.search(player)
if match:
if team == 'RESISTANCE':
player = player[:match.span()[0]] + ' 🐳' + player[match.span()[0]:]
elif team == 'ENLIGHTENED':
player = player[:match.span()[0]] + ' 🐸' + player[match.span()[0]:]
msg += player
elif mark[0] == 'PLAYER' or mark[0] == 'AT_PLAYER':
player = mark[1]['plain']
team = mark[1]['team']
msg += player
if team == 'RESISTANCE':
msg += ' 🐳'
elif team == 'ENLIGHTENED':
msg += ' 🐸'
elif mark[0] == 'TEXT':
msg += mark[1]['plain']
pattern = re.compile('\[secure\]')
match = pattern.search(msg)
if match:
if msg.find(':') != -1:
msg = msg[:9] + '@' + msg[9:]
else:
msg = msg[:10] + '@' + msg[10:]
else:
msg = '@' + msg
return msg
def insertDB(time, msg):
logger = logging.getLogger('insertDB')
Conn = MongoClient()
database = Conn['COMM_Hangzhou']
mycollection = database.entries
post = {"time": time, "msg": msg}
mycollection.insert(post)
def main():
logger = logging.getLogger('main')
field = {
'minLngE6':119618783,
'minLatE6':29912919,
'maxLngE6':121018722,
'maxLatE6':30573739,
}
mints = -1
maxts=-1
reverse=False
tab='all'
while True:
try:
if fetchCookie():
break
except CookieException:
time.sleep(3)
count = 0
while True:
count += 1
with open('cookie') as cookies:
cookies = cookies.read().strip()
logger.info(getTime() + ": {} Fetching from Intel...".format(str(count)))
while True:
try:
intel = ingrex.Intel(cookies, field)
result = intel.fetch_msg(mints, maxts, reverse, tab)
if result:
mints = result[0][1] + 1
break
except CookieError:
while True:
try:
if fetchCookie():
break
except CookieException:
time.sleep(3)
for item in result[::-1]:
message = ingrex.Message(item)
if message.ptype == 'PLAYER_GENERATED':
logger.info(getTime() + str(item))
msg = formatMessage(item)
if msg == 'Blocked':
logger.info(getTime() + " " + message.text)
else:
msg = message.time + " " + msg
logger.info(getTime() + " " + msg)
insertDB(message.time, msg)
sendMonitor(bot, msg)
#sendMessge(bot, msg)
time.sleep(10)
if __name__ == '__main__':
readConfig()
bot = telegram.Bot(BOT_TOKEN)
while True:
try:
main()
except Exception:
sendMonitor(bot, 'Main Error')