-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.py
130 lines (105 loc) · 4.65 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import os
import random
import requests
from dotenv import load_dotenv
def get_last_comic_number():
current_comic_url = 'https://xkcd.com/info.0.json'
xkcd_response = requests.get(current_comic_url)
xkcd_response.raise_for_status()
last_comic_number = xkcd_response.json()['num']
return last_comic_number
def download_random_comic(last_comic_number):
random_comic_number = random.randint(1, last_comic_number)
comic_url = f"""https://xkcd.com/{random_comic_number}/info.0.json"""
comic_response = requests.get(comic_url)
comic_response.raise_for_status()
comic_details = comic_response.json()
comic_image_url = comic_details['img']
comic_comments = comic_details['alt']
comic_image_name = f"""comic_{random_comic_number}.jpg"""
image_response = requests.get(comic_image_url)
image_response.raise_for_status()
with open(comic_image_name, 'wb') as file:
file.write(image_response.content)
return comic_image_name, comic_comments
def check_vk_response(response):
vk_response = response.json()
if 'error' in vk_response:
error_message = vk_response['error'].get('error_msg', 'Unknown error')
error_code = vk_response['error'].get('error_code', 'Unknown error code')
raise requests.HTTPError(f'VK API responded with an error code {error_code}: {error_message}')
def get_upload_url(vk_group_id, vk_access_token):
method = 'photos.getWallUploadServer'
vk_url = f'https://api.vk.com/method/{method}'
params = {
'group_id': vk_group_id,
'access_token': vk_access_token,
'v': '5.131'
}
vk_response = requests.get(vk_url, params=params)
check_vk_response(vk_response)
vk_server_upload_url = vk_response.json()['response']["upload_url"]
return vk_server_upload_url
def upload_photo_to_vk_server(vk_server_upload_url, comic_image_name):
with open(comic_image_name, 'rb') as file:
files = {
'photo': file,
}
vk_response = requests.post(vk_server_upload_url, files=files)
check_vk_response(vk_response)
uploaded_vk_server_parameters = vk_response.json()
uploaded_photo_parameters = uploaded_vk_server_parameters['photo']
uploaded_server = uploaded_vk_server_parameters['server']
uploaded_hash = uploaded_vk_server_parameters['hash']
return uploaded_photo_parameters, uploaded_server, uploaded_hash
def save_photo_to_vk_wall(vk_group_id, vk_access_token, uploaded_photo_parameters, uploaded_server, uploaded_hash):
method = 'photos.saveWallPhoto'
vk_url = f'''https://api.vk.com/method/{method}'''
vk_wall_settings = {
"group_id": vk_group_id,
"access_token": vk_access_token,
"v": "5.131",
"photo": uploaded_photo_parameters,
"server": uploaded_server,
"hash": uploaded_hash,
}
vk_response = requests.post(vk_url, data=vk_wall_settings)
check_vk_response(vk_response)
saved_photo_details = vk_response.json()['response'][0]
saved_photo_owner_id = saved_photo_details['owner_id']
saved_photo_id = saved_photo_details['id']
return saved_photo_owner_id, saved_photo_id
def publish_post_to_vk_group_wall(vk_group_id, vk_access_token, saved_photo_owner_id, saved_photo_id, comments):
method = 'wall.post'
vk_url = f'''https://api.vk.com/method/{method}'''
attachments = f"photo{saved_photo_owner_id}_{saved_photo_id}"
data = {
"owner_id": -int(vk_group_id),
"access_token": vk_access_token,
"v": "5.131",
"attachments": attachments,
"message": comments
}
vk_response = requests.post(vk_url, data=data)
check_vk_response(vk_response)
return vk_response.ok
def main():
load_dotenv()
vk_access_token = os.getenv('VK_ACCESS_TOKEN')
vk_group_id = os.getenv('VK_GROUP_ID')
last_comic_number = get_last_comic_number()
vk_server_upload_url = get_upload_url(vk_group_id, vk_access_token)
try:
comic_image_name, comic_comments = download_random_comic(last_comic_number)
uploaded_photo_parameters, uploaded_server, uploaded_hash = upload_photo_to_vk_server(vk_server_upload_url, comic_image_name)
finally:
if os.path.exists(comic_image_name):
os.remove(comic_image_name)
saved_photo_owner_id, saved_photo_id = save_photo_to_vk_wall(vk_group_id, vk_access_token, uploaded_photo_parameters, uploaded_server, uploaded_hash)
post_successful = publish_post_to_vk_group_wall(vk_group_id, vk_access_token, saved_photo_owner_id, saved_photo_id, comic_comments)
if post_successful:
print("Comix posted successfully!")
else:
print("Failed to post the comic.")
if __name__ == "__main__":
main()