· 5 years ago · Jul 20, 2020, 02:08 AM
1from etsy2 import Etsy
2from etsy2.oauth import EtsyOAuthClient
3from etsy2.oauth import EtsyOAuthHelper
4import sys
5import json, os, io, time, datetime, html
6import webbrowser
7import urllib.parse as urlparse
8from urllib.parse import parse_qs
9
10def outputToFile(data, filename="output.json"):
11 with io.open(filename, "w", encoding="utf-8") as file:
12 json.dump(data, file)
13 file.close()
14 return None
15
16def loadFromFile(filename):
17 with io.open(filename, "r", encoding="utf-8") as file:
18 products = json.load(file)
19 file.close()
20 return products
21 return None
22
23class EtsyApiClass:
24
25 Settings = dict()
26 _SettingsFile = "Settings.json"
27
28 @property
29 def api_key(self):
30 return self.Settings['api_key']
31
32 @property
33 def _api_key(self):
34 return self.Settings['api_key']
35 @_api_key.setter
36 def _api_key(self, value):
37 key = 'api_key'
38 if value is None:
39 self.Settings.pop(key)
40 else:
41 self.Settings[key]=value
42 outputToFile(self.Settings, self._SettingsFile)
43 return
44
45 @property
46 def shared_secret(self): return self.Settings['shared_secret']
47
48 @property
49 def _shared_secret(self): return self.Settings['shared_secret']
50 @_shared_secret.setter
51 def _shared_secret(self, value):
52 key = 'shared_secret'
53 if value is None:
54 self.Settings.pop(key)
55 else:
56 self.Settings[key]=value
57 outputToFile(self.Settings, self._SettingsFile)
58 return
59
60 @property
61 def oauth_token(self): return self.Settings['oauth_token']
62 @oauth_token.setter
63 def oauth_token(self, value):
64 key = 'oauth_token'
65 if value is None:
66 self.Settings.pop(key)
67 else:
68 self.Settings[key]=value
69 outputToFile(self.Settings, self._SettingsFile)
70 return
71
72 @property
73 def oauth_token_secret(self): return self.Settings['oauth_token_secret']
74 @oauth_token_secret.setter
75 def oauth_token_secret(self, value):
76 key = 'oauth_token_secret'
77 if value is None:
78 self.Settings.pop(key)
79 else:
80 self.Settings[key]=value
81 outputToFile(self.Settings, self._SettingsFile)
82 return
83
84 def __init__(self):
85 self.Settings = dict()
86 if os.path.exists(self._SettingsFile):
87 self.Settings = loadFromFile(self._SettingsFile)
88 return
89
90 def doOauth(self):
91 try:
92 self.api_key
93 self.shared_secret
94 self.oauth_token
95 self.oauth_token_secret
96 return 0
97 except:
98 pass
99 print("Create your app at https://www.etsy.com/developers/your-apps")
100 setApiKey = input("Set your API key (KEYSTRING) here: ")
101 if setApiKey:
102 setApiSecret = input("Please input your SHARED SECRET: ")
103 if setApiSecret:
104 self._api_key = setApiKey
105 self._shared_secret = setApiSecret
106 else:
107 print("API Key not set, please try again")
108 return -1
109 else:
110 print("API Key not set, please try again")
111 return -1
112
113 etsy = Etsy(api_key=self.api_key)
114
115 # define permissions scopes as defined in the 'OAuth Authentication' section of the docs
116 # https://www.etsy.com/developers/documentation/getting_started/oauth#section_permission_scopes
117 permission_scopes = ['transactions_r', 'feedback_r']
118 callback_url = None
119
120 # call get_request_url_and_token_secret to get the login_url and temp_oauth_token_secret
121 try:
122 login_url, temp_oauth_token_secret = EtsyOAuthHelper.get_request_url_and_token_secret(self.api_key, self.shared_secret, permission_scopes, callback_url)
123 print(login_url)
124 webbrowser.open(login_url)
125
126 verifier_key = input('Paste your verifier key here: ')
127
128 query = urlparse.urlparse(login_url).query
129 temp_oauth_token = parse_qs(query)['oauth_token'][0]
130
131 self.oauth_token, self.oauth_token_secret = self._get_oauth_info(temp_oauth_token, temp_oauth_token_secret, verifier_key)
132 except:
133 self._api_key = None
134 self._shared_secret = None
135 print("Invalid credentials")
136 return -1
137
138 # Note,
139 # login_url is the url to redirect the user to have them authenticate with etsy.
140 # temp_oauth_token_secret is the secret used in the get_ouath_token methods to retrieve permanent oauth credentials.
141 # <callback_url> is the url you want etsy to redirect the user to after logging in to etsy. If null the user will be redirected to a page displaying the the verification code the user will need to manually enter.
142 return 0
143
144 def _get_oauth_info(self, temp_oauth_token, temp_oauth_token_secret, verifier_key):
145 oauth_token, oauth_token_secret = EtsyOAuthHelper.get_oauth_token_via_verifier(self.api_key, self.shared_secret, temp_oauth_token, temp_oauth_token_secret, verifier_key)
146 print(oauth_token)
147 print(oauth_token_secret)
148
149 return oauth_token, oauth_token_secret
150
151 def getEtsyOauth(self):
152 etsy_oauth = EtsyOAuthClient(client_key=self.api_key,
153 client_secret=self.shared_secret,
154 resource_owner_key=self.oauth_token,
155 resource_owner_secret=self.oauth_token_secret)
156 etsy = Etsy(etsy_oauth_client=etsy_oauth)
157 return etsy
158
159 def FindNegativeBuyers(self, shop_id):
160 etsy = self.getEtsyOauth()
161
162 receiptsOpen = etsy.findAllShopReceiptsByStatus(shop_id=shop_id, status='open', limit=100, includes="Transactions,Buyer") #enum(open, unshipped, unpaid, completed, processing, all)
163
164 userFeedbacks = list()
165
166 summary = ''
167 for receiptOpen in receiptsOpen:
168 if 'guest_user_id' in receiptOpen['Buyer']:
169 summary += "{} positive, {} neutral, {} negative (GUEST {} {})\n".format(positive, neutral, negative, receiptOpen['name'], receiptOpen['buyer_user_id'])
170 continue #this is a guest user so skip
171 thisUsersFeedbackList = etsy.findAllUserFeedbackAsBuyer( user_id = receiptOpen['buyer_user_id'], limit=100, includes='Buyer,Seller,Author,Subject,Transaction,Listing' )
172 userFeedbacks.append( thisUsersFeedbackList )
173
174 negative = 0
175 neutral = 0
176 positive = 0
177 for thisUsersFeedback in thisUsersFeedbackList:
178 if thisUsersFeedback['value'] <= 0:
179 print ("{} {} {}: {}\n".format('+' if thisUsersFeedback['value']>0 else '-' if thisUsersFeedback['value']<0 else '~', datetime.datetime.fromtimestamp(thisUsersFeedback['creation_tsz']), receiptOpen['name'], html.unescape(thisUsersFeedback['message'])))
180
181 if thisUsersFeedback['value'] == 0: neutral += 1
182 else: negative += 1
183
184 else:
185 positive += 1
186 if thisUsersFeedback['message'] and ('4 star' in thisUsersFeedback['message'].lower() or 'four star' in thisUsersFeedback['message'].lower()):
187 print ("{} {} {}: {}\n".format('+' if thisUsersFeedback['value']>0 else '-' if thisUsersFeedback['value']<0 else '~', datetime.datetime.fromtimestamp(thisUsersFeedback['creation_tsz']), receiptOpen['name'], html.unescape(thisUsersFeedback['message'])))
188 summary += "{} positive, {} neutral, {} negative ({} {})\n".format(positive, neutral, negative, receiptOpen['name'], receiptOpen['buyer_user_id'])
189
190 print(summary)
191
192 return userFeedbacks
193
194 def showReviewsForUser(self, etsy, user_id,):
195 time.sleep(2.4)
196 print('\n')
197 user = etsy.getUser(user_id=user_id, includes='Profile')
198 full_name = "{} {}".format(user[0]['Profile']['first_name'], user[0]['Profile']['last_name'])
199 userFeedback = etsy.findAllUserFeedbackAsBuyer( user_id = user[0]['user_id'], includes='Buyer,Seller,Author,Subject,Transaction,Listing' )
200 for thisUsersFeedback in userFeedback:
201 print ("{} {} {}: {}\n".format('+' if thisUsersFeedback['value']>0 else '-' if thisUsersFeedback['value']<0 else '~', datetime.datetime.fromtimestamp(thisUsersFeedback['creation_tsz']), full_name, html.unescape(thisUsersFeedback['message'])))
202 return
203
204#------------------------------------------------------------------
205def main(argv):
206 if(len(argv)==1):
207
208 e = EtsyApiClass()
209
210 if e.doOauth() == 0:
211 e.FindNegativeBuyers(argv[0])
212
213 else:
214 print('Please provide 1 argument (shop_id)')
215
216
217if __name__ == "__main__":
218 main(sys.argv[1:])