Как отправить фото с ПК в беседу VK_API
Всем привет! Мне надо, чтобы бот отправлял фотку C ПК в беседу ВКонтакте. Вот моя часть кода:
import vk_api from bs4 import BeautifulSoup import time import requests vk_session = vk_api.VkApi(token=TOKEN1) # Вход по токену. vk = vk_session.get_api() slovo = 'изменения' or 'изменение' or 'расписание' url = 'https://vk.com/' + doc if slovo in text: if ts > old_ts: print('-----------------') print('отправил сообщение') print('-----------------\n') arg = 'wall-'+new_owner+'_'+ts_id # получаем данный на последний пост webbrowser.open_new_tab(url) time.sleep(1) screen = pyautogui.screenshot('screenshot.png') pyautogui.screenshot('screenshot.png', region=(814, 300, 100, 200)) template = pyautogui.locateOnScreen('screenshot.png') #vk.messages.send(chat_id='2',random_id = '',attachment = arg,message = '.') # отправляем от лица группы в ЛС time.sleep(8) os.remove('C:\\Users\\weil\\Desktop\\vk\\screenshot.png') print('successful')
Отслеживать
3,036 2 2 золотых знака 10 10 серебряных знаков 35 35 бронзовых знаков
Как отправить фото в сообщении через vk_api
Написал бота на python, но для полноценной работы нужна возможность отправлять фото в сообщении. Как это сделать? В Гугле информации не нашел. Использую библиотеку vk_api.
Голосование за лучший ответ
сначала делаешь
photos.getMessagesUploadServer
оно вернёт адрес сервера для загрузки фото
затем post-запросом закидываешь на этот адрес своё фото как multipart/form-data:
Content-Disposition: form-data; name=»photo»; filename=»photo.png»
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
затем вызываешь
photos.saveMessagesPhoto
оно вернёт идентификатор сохраненного изображения
и в конце делаешь
messages.send
скормив в attachment идентификатор своего фото
Как отправить фото в Вк ботом с помощью Python?
Я новичок и только начал разбираться в pythone. Посмотрел много решений не помогло. Я хочу отправить фото с компьютера в личное сообщение с пользователем от имени сообщества. Помогите пожалуйста и пожалуйста можно очень подробно.
Заранее спасибо.
- Вопрос задан более трёх лет назад
- 15948 просмотров
Комментировать
Решения вопроса 0
Ответы на вопрос 3
EvgenyCherny @EvgenyCherny
I’m don’t want you say I love you.
Привет, ты можешь воспользоваться комментариями выше, но я отвечу на твой вопрос
«Я хочу отправить фото с компьютера»
так вот чтобы отправить фото с компьютера нужно его загрузить и отправить методом messages.send
Ниже приведен код:
a = vk.method("photos.getMessagesUploadServer") b = requests.post(a['upload_url'], files=).json() c = vk.method('photos.saveMessagesPhoto', )[0] d = "photo<>_<>".format(c["owner_id"], c["id"]) vk.method("messages.send", )
Также не забудьте прописать import requests
Ответ написан более трёх лет назад
Нравится 1 1 комментарий
Знаю, что поздно пишу, но у меня ошибка
File "E:\Projects\Bots\Telegram Bot to Vk posting\vk2.py", line 10, in b = requests.post(vk.method("photos.getMessagesUploadServer")['upload_url'], files=).json() TypeError: VkApiMethod.__call__() takes 1 positional argument but 2 were given
Роман @Bloodie_lie
В vk_api встроена нужная вам функция VkUpload
Пример:
upload = vk_api.VkUpload(vk) photo = upload.photo_messages('вашфайл') owner_id = photo[0]['owner_id'] photo_id = photo[0]['id'] access_key = photo[0]['access_key'] attachment = f'photo__' vk.messages.send(peer_id=event.object.peer_id, random_id=0, attachment=attachment)
Ответ написан более трёх лет назад
Нравится 1 2 комментария
wenzeslaus @wenzeslaus
знаю поздно пишу , но у меня он жалуется на последнюю строчку vk.messages.send(peer_id=event.object.peer_id, random_id=0, attachment=attachment)
Traceback (most recent call last):
File «C:/Users/slava/PycharmProjects/pythonProject1/venv/test.py», line 24, in
vk.messages.send(peer_id=event.object.peer_id, random_id=0, attachment=attachment)
NameError: name ‘event’ is not defined
Я в этом деле новичок, но хотелось бы узнать почему это могло произойти. В качестве фотографии я использую скриншот
pg.screenshot("screenshotacran.png") upload = vk_api.VkUpload(vk) photo = upload.photo_messages('screenshotacran.png') owner_id = photo[0]['owner_id'] photo_id = photo[0]['id'] access_key = photo[0]['access_key'] attachment = f'photo__' vk.messages.send(peer_id=event.object.peer_id, random_id=0, attachment=attachment)
AHK: Загрузка фотографии в беседу через API ВКонтакте
Здравствуйте.
Подскажите пожалуйста, почему в беседу ВКонтакте (созданную через группу) не получается отправить фотографию?
Выдаёт вот такую ошибку:
P.S: Да, я понимаю, что скорее всего дело в отрицательном user_id (т.к это беседа, а не определённый человек), но что писать вместо него? В документации API ВКонтакте покопался, в методах photos.getMessagesUploadServer , photos.saveMessagesPhoto , и там к сожалению нет никаких намёков об отправке в беседу.
Code:
+ открыть спойлер
#SingleInstance Force #Persistent #NoEnv #Include CreateFormData.ahk global vk_id := 123456789 global vk_token := "b8da9ffae451f1453e3beded6afae451f1453b82d759f60473fae451f1453cfe95dfae451f1453bc83ec519f" global conversation := 1 global chat_id := 2000000000 + conversation global proxy := "https://" ; "https://vk-api-proxy.xtrafrancyz.net/_/" uploadScreenshotToVK("screen.png") ExitApp JsonEvalToObj(json_text) < JSONvar = (LTrim Join %json_text% ) htmldoc := ComObjCreate("htmlfile") Script := htmldoc.Script Script.execScript(" ", "JScript") json_obj := Script.eval("(" . JSONvar . ")") return json_obj >uploadScreenshotToVK(file_path) < HTTP := ComObjCreate("WinHttp.WinHttpRequest.5.1") if conversation HTTP.Open("GET", proxy "api.vk.com/method/photos.getMessagesUploadServer?&access_token=" vk_token "&v=5.103", true) else HTTP.Open("GET", proxy "api.vk.com/method/photos.getMessagesUploadServer?peer_id=" vk_id "&access_token=" vk_token "&v=5.103", true) HTTP.Send() HTTP.WaitForResponse() RegexMatch(HTTP.responsetext, "upload_url"":""(.+?)""", match) server := StrReplace(match1, "\/", "/") objParam := CreateFormData(PostData, hdr_ContentType, objParam) HTTP.Open("POST", server, true) HTTP.SetRequestHeader("Content-Type", hdr_ContentType) HTTP.Send(PostData) HTTP.WaitForResponse() RegexMatch(HTTP.responsetext, "\
Include code:
+ открыть спойлер
; CreateFormData() by tmplinshi, AHK Topic: https://autohotkey.com/boards/viewtopic.php?t=7647 ; Thanks to Coco: https://autohotkey.com/boards/viewtopic.php?p=41731#p41731 ; Modified version by SKAN, 09/May/2016 CreateFormData(ByRef retData, ByRef retHeader, objParam) < New CreateFormData(retData, retHeader, objParam) >Class CreateFormData < __New(ByRef retData, ByRef retHeader, objParam) < Local CRLF := "`r`n", i, k, v, str, pvData ; Create a random Boundary Local Boundary := this.RandomBoundary() Local BoundaryLine := "------------------------------" . Boundary this.Len := 0 ; GMEM_ZEROINIT|GMEM_FIXED = 0x40 this.Ptr := DllCall( "GlobalAlloc", "UInt",0x40, "UInt",1, "Ptr" ) ; allocate global memory ; Loop input paramters For k, v in objParam < If IsObject(v) < For i, FileName in v < str := BoundaryLine . CRLF . "Content-Disposition: form-data; name=""" . k . """; filename=""" . FileName . """" . CRLF . "Content-Type: " . this.MimeType(FileName) . CRLF . CRLF this.StrPutUTF8( str ) this.LoadFromFile( Filename ) this.StrPutUTF8( CRLF ) >> Else < str := BoundaryLine . CRLF . "Content-Disposition: form-data; name=""" . k """" . CRLF . CRLF . v . CRLF this.StrPutUTF8( str ) >> this.StrPutUTF8( BoundaryLine . "--" . CRLF ) ; Create a bytearray and copy data in to it. retData := ComObjArray( 0x11, this.Len ) ; Create SAFEARRAY = VT_ARRAY|VT_UI1 pvData := NumGet( ComObjValue( retData ) + 8 + A_PtrSize ) DllCall( "RtlMoveMemory", "Ptr",pvData, "Ptr",this.Ptr, "Ptr",this.Len ) this.Ptr := DllCall( "GlobalFree", "Ptr",this.Ptr, "Ptr" ) ; free global memory retHeader := "multipart/form-data; boundary=----------------------------" . Boundary > StrPutUTF8( str ) < Local ReqSz := StrPut( str, "utf-8" ) - 1 this.Len += ReqSz ; GMEM_ZEROINIT|GMEM_MOVEABLE = 0x42 this.Ptr := DllCall( "GlobalReAlloc", "Ptr",this.Ptr, "UInt",this.len + 1, "UInt", 0x42 ) StrPut( str, this.Ptr + this.len - ReqSz, ReqSz, "utf-8" ) >LoadFromFile( Filename ) < Local objFile := FileOpen( FileName, "r" ) this.Len += objFile.Length ; GMEM_ZEROINIT|GMEM_MOVEABLE = 0x42 this.Ptr := DllCall( "GlobalReAlloc", "Ptr",this.Ptr, "UInt",this.len, "UInt", 0x42 ) objFile.RawRead( this.Ptr + this.Len - objFile.length, objFile.length ) objFile.Close() >RandomBoundary() < str := "0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z" Sort, str, D| Random str := StrReplace(str, "|") Return SubStr(str, 1, 12) >MimeType(FileName) < n := FileOpen(FileName, "r").ReadUInt() Return (n = 0x474E5089) ? "image/png" : (n = 0x38464947) ? "image/gif" : (n&0xFFFF = 0x4D42 ) ? "image/bmp" : (n&0xFFFF = 0xD8FF ) ? "image/jpeg" : (n&0xFFFF = 0x4949 ) ? "image/tiff" : (n&0xFFFF = 0x4D4D ) ? "image/tiff" : "application/octet-stream" >>
2 Ответ от Malcev 2020-03-03 17:15:28
- Malcev
- Разработчик
- Неактивен
Re: AHK: Загрузка фотографии в беседу через API ВКонтакте
А где в апи написано, что если peer_id - группа, то ее айди указывать не надо?
if conversation HTTP.Open("GET", proxy "api.vk.com/method/photos.getMessagesUploadServer?&access_token=" vk_token "&v=5.103", true) else HTTP.Open("GET", proxy "api.vk.com/method/photos.getMessagesUploadServer?peer_id=" vk_id "&access_token=" vk_token "&v=5.103", true)
3 Ответ от kolotilov256 2020-03-03 17:19:02 (изменено: kolotilov256, 2020-03-03 17:25:16)
Re: AHK: Загрузка фотографии в беседу через API ВКонтакте
Вот только вопрос, что указывать в peer_id ?
Пробовал id самой группы (https://vk.com/club182104136) (Вот эти 182104136)
Пробовал chat_id (который 200000000+cвой ид)
Пробовал отрицательный id (-182104136)
Ничего не сработало.
А по поводу того, почему удалил peer_id :
По моей логике фотография должна загружается куда-то в саму группу, а далее уже передаваться прикреплённой ссылкой в беседу.
На скриншоте в документации так и написано (Параметр peer_id , для загрузки фотографии в сообщениях сообществ)
У меня не личные сообщения сообщества, у меня беседа сообщества.
4 Ответ от Malcev 2020-03-03 17:34:11
- Malcev
- Разработчик
- Неактивен