import autopy
from time import sleep
import subprocess
import re
m = autopy.mouse
k = autopy.key
class count_detector:
CORRECTED_MSG = 'Showing results for'
#a comma seperated number
NUMBER = re.compile(r'^[\d]{1,3}(,[\d]{3})*$')
def calibrate(self):
#determine position of search field:
raw_input('please move cursor over search field and press enter.')
self.search_field = m.get_pos()
#determine position of result count
print("Search something google will find.")
raw_input('Then move the cursor over the count and press enter.')
self.result = m.get_pos()
#Google might autocorrect the query foo to ba.
#In this case we need to press 'Search instead for foo'
#in order to get the right count
print("Search something google will autocorrect.")
raw_input("Move cursor slightly left to 'Showing results for ' and press enter.")
self.autocorrect_indicator_left = m.get_pos()
raw_input("Move cursor to the right of whole 'Showing results for '-thing and press enter.")
self.autocorrect_indicator_right = m.get_pos()
#adjust right point. we need about same y-value and the one from left point is death sure
self.autocorrect_indicator_right = (self.autocorrect_indicator_right[0],
self.autocorrect_indicator_left[1])
raw_input("Move cursor over 'Search instead for '-link and press enter")
self.deautocorrect = m.get_pos()
def get_count(self, word):
#get focus
m.move(*self.search_field)
#select old
m.click()
m.click()
m.click()
sleep(5)
#enter new
k.type_string(word, 100)
k.tap(k.K_RETURN)
#get result count
count = self.__fetch_results(1, 2)
if not self.__is_count(count): # if field is blank -> no entrys
count = '0'
else:
#check for possible autocorrect
#select possible 'Showing results for' message and examine
m.move(*self.autocorrect_indicator_left)
sleep(1)
m.toggle(True)
m.move(*self.autocorrect_indicator_right)
m.toggle(False)
string = self.__get_clipboard(2)
if string.find(self.CORRECTED_MSG) == 0:
#if query was autocorrected, deautocorrect
m.move(*self.deautocorrect)
m.click()
count = self.__fetch_results(2, 2)
return count
def __fetch_results(self, waiting_time, waiting_time2):
sleep(waiting_time)
m.move(*self.result)
m.click()
m.click()
return self.__get_clipboard(waiting_time2)
def __get_clipboard(self, waiting_time):
sleep(waiting_time)
child = subprocess.Popen('xsel', stdout=subprocess.PIPE)
count = child.communicate()
return count[0]
#determine if scrapped count is valid to sort out 'nothing found' and stuff
def __is_count(self, number_to_test):
return self.NUMBER.match(number_to_test)
Diff to Previous Revision
--- revision 1 2012-12-31 15:25:43
+++ revision 2 2012-12-31 15:33:39
@@ -73,7 +73,7 @@
string = self.__get_clipboard(2)
- if string.find(self.CORRECTED_MSG) > -1:
+ if string.find(self.CORRECTED_MSG) == 0:
#if query was autocorrected, deautocorrect
m.move(*self.deautocorrect)
m.click()