stopforumspam-checker.py
· 2.0 KiB · Python
Ham
# The amount of days within which to check if the user was reported
LAST_SEEN_THRESHOLD = 180
# The contact name to use in rejection messages
CONTACT = "Admin at admin@example.com"
from urllib.parse import urlencode
from datetime import datetime
import requests
context['sfs'] = {}
prompt_data = request.context.get("prompt_data")
user_data = {}
if ak_client_ip != ip_address('255.255.255.255'):
user_data['ip'] = str(ak_client_ip)
if 'email' in prompt_data:
user_data['email'] = prompt_data['email']
if 'username' in prompt_data:
user_data['username'] = prompt_data['username']
if len(user_data) == 0:
ak_logger.warning("Could not find any user data to check against StopForumSpam")
return True
context['sfs']['request_data'] = user_data
resp = requests.get("http://api.stopforumspam.org/api?json&" + urlencode(user_data))
if resp.status_code != 200:
ak_message(f"There was an error creating your account. Please contact {CONTACT} with the following details: SFS HTTP Error {resp.status_code}")
ak_logger.warning("StopForumSpam HTTP error", status_code=resp.status_code)
return False
data = resp.json()
context['sfs']['response_data'] = data
if data['success'] == 0 and 'error' in data:
ak_message(f"There was an error creating your account. Please contact {CONTACT} with the following details: SFS Error '{data['error']['message']}'")
ak_logger.warning("StopForumSpam error", msg=data['error']['message'])
return False
rejected_items = []
def check_passes(name):
if 'lastseen' in data[name]:
last_seen = datetime.strptime(data[name]['lastseen'], '%Y-%m-%d %H:%M:%S')
time_elapsed = datetime.now() - last_seen
if time_elapsed.days < LAST_SEEN_THRESHOLD:
rejected_items.append(name)
check_passes('ip')
check_passes('email')
check_passes('username')
if len(rejected_items) > 0:
context['sfs']['rejected_for'] = rejected_items
ak_message(f"Sorry, we cannot create your account at this time. Please come back later or contact {CONTACT} if the issue persists.")
return False
return True
1 | # The amount of days within which to check if the user was reported |
2 | LAST_SEEN_THRESHOLD = 180 |
3 | |
4 | # The contact name to use in rejection messages |
5 | CONTACT = "Admin at admin@example.com" |
6 | |
7 | from urllib.parse import urlencode |
8 | from datetime import datetime |
9 | import requests |
10 | |
11 | context['sfs'] = {} |
12 | prompt_data = request.context.get("prompt_data") |
13 | |
14 | user_data = {} |
15 | if ak_client_ip != ip_address('255.255.255.255'): |
16 | user_data['ip'] = str(ak_client_ip) |
17 | if 'email' in prompt_data: |
18 | user_data['email'] = prompt_data['email'] |
19 | if 'username' in prompt_data: |
20 | user_data['username'] = prompt_data['username'] |
21 | |
22 | if len(user_data) == 0: |
23 | ak_logger.warning("Could not find any user data to check against StopForumSpam") |
24 | return True |
25 | |
26 | context['sfs']['request_data'] = user_data |
27 | resp = requests.get("http://api.stopforumspam.org/api?json&" + urlencode(user_data)) |
28 | |
29 | if resp.status_code != 200: |
30 | ak_message(f"There was an error creating your account. Please contact {CONTACT} with the following details: SFS HTTP Error {resp.status_code}") |
31 | ak_logger.warning("StopForumSpam HTTP error", status_code=resp.status_code) |
32 | return False |
33 | |
34 | data = resp.json() |
35 | context['sfs']['response_data'] = data |
36 | |
37 | if data['success'] == 0 and 'error' in data: |
38 | ak_message(f"There was an error creating your account. Please contact {CONTACT} with the following details: SFS Error '{data['error']['message']}'") |
39 | ak_logger.warning("StopForumSpam error", msg=data['error']['message']) |
40 | return False |
41 | |
42 | rejected_items = [] |
43 | def check_passes(name): |
44 | if 'lastseen' in data[name]: |
45 | last_seen = datetime.strptime(data[name]['lastseen'], '%Y-%m-%d %H:%M:%S') |
46 | time_elapsed = datetime.now() - last_seen |
47 | if time_elapsed.days < LAST_SEEN_THRESHOLD: |
48 | rejected_items.append(name) |
49 | |
50 | check_passes('ip') |
51 | check_passes('email') |
52 | check_passes('username') |
53 | |
54 | if len(rejected_items) > 0: |
55 | context['sfs']['rejected_for'] = rejected_items |
56 | ak_message(f"Sorry, we cannot create your account at this time. Please come back later or contact {CONTACT} if the issue persists.") |
57 | return False |
58 | |
59 | return True |