суббота, 6 февраля 2016 г.

Использование библиотеки Yowsup 2 для отправки сообщений пользователю WhatsApp

Yowsup 2 является python библиотекой, которая позволяет строить приложения, используя услуги WhatsApp.

Установка Yowsup 2

Ставим пакеты, которые понадобятся:
# yum install python python-dateutil python-argparse 
# yum install libtiff-devel libjpeg-devel libzip-devel freetype-devel lcms2-devel libwebp-devel tcl-devel tk-devel zlib-devel
# yum install gcc
# yum install python-devel
# yum install protobuf pycrypto
# yum -y install python-pip
# pip install --upgrade pip
# yum install python-imaging
Выполняем установку:
# cd /usr/src/
# wget https://github.com/tgalal/yowsup/archive/master.zip
# unzip master
# cd yowsup-master/
# python setup.py install

Регистрация пользователя WhatsApp

Сервер, с которого будут рассылаться сообщения, должен иметь телефонный номер для регистрации. Этот же номер будет использоваться для отправки сообщений.  Наша задача запросить код регистрации на наш номер телефона. 
Это делается командой:
# python yowsup-cli registration --requestcode sms --phone 79171112222 --cc 7 --mcc 250 --mnc 01
Здесь:
79171112222 – номер телефона, от имени которого регистрируем сервер.
сс – код страны. Россия – 7
mcc - mobile country code - это другой код страны (для России это 250)
mnc - mobile network code - это код вашего оператора. (01 - МТС, 02 - мегафон, 20 - теле2, 99 - билайн)
У меня МТС поэтому, я буду вписывать mnc = 01
В ответ увидим:
INFO:yowsup.common.http.warequest:{"status":"sent","length":6,"method":"sms","retry_after":64,"sms_wait":64,"voice_wait":64}
status: sent
retry_after: 64
length: 6
method: sms
На телефонный аппарат приходит SMS с кодом подтверждения
У меня код был такой: 930-620
Имея этот код, завершаем процедуру регистрации:
# python yowsup-cli registration --register 930-620 --phone 79171112222 --cc 7
Вывод ответа сервера:
INFO:yowsup.common.http.warequest:{"status":"ok","login":"79171112222","type":"new","pw":"0t7OhrPLwf9KjX5qkwnVqTtXXmg=","expiration":4444444444.0,"kind":"free","price":"33,00 \u0440\u0443\u0431.","cost":"33.00","currency":"RUB","price_expiration":1457232900} 
status: ok
kind: free
pw: 0t7OhrPLwf9KjX5qkwnVqTtXXmg=
price: 33,00 руб.
price_expiration: 1457232900
currency: RUB
cost: 33.00
expiration: 4444444444.0
login: 79171112222
type: new
Главное, что нам требуется пароль. Здесь он в строке:
pw: 0t7OhrPLwf9KjX5qkwnVqTtXXmg=

Создание конфигурации пользователя Yowsup 2

Прямо в каталоге /usr/src/yowsup-master/ создаем конфигурационный файл:
# nano yowsup-cli.config
Вписываем туда:
cc=7
phone=79171112222
password=0t7OhrPLwf9KjX5qkwnVqTtXXmg=

Отправка сообщений:

Отправка сообщений  WhatsApp через командную строку из директории /usr/src/yowsup-master/:
# yowsup-cli demos -c yowsup-cli.config -M -s 79171440055 "Авария"
Ответ сервера:
INFO:yowsup.demos.sendclient.layer:Message sent
Отправка сообщений из любого каталага:
# /usr/bin/yowsup-cli demos -c /usr/src/yowsup-master/yowsup-cli.config -M –s “Сообщение”
Для того что бы мы могли отправлять сообщения через самописную web-страницу, необходимо пользователю apache разрешить отправку сообщений из консоли. Для этого необходимо:
1) разрешить пользователю apache запускать команду /usr/bin/yowsup-cli. Это делается в файле /etc/sudoers 
# nano /etc/sudoers
После строчки
root    ALL=(ALL)       ALL
Вписываем
ALL ALL=(root) NOPASSWD: /usr/bin/yowsup-cli
2) скопировать установочный файл программы yowsup в домашний каталог apache
# cp -R /root/.yowsup/ /var/www/.yowsup
# chown -R apache:apache /var/www/.yowsup/
Если этого не сделать, то сообщения отправляться не будут, а в файле ошибок apache - /var/log/httpd/error_log будет появляться сообщение:
Traceback (most recent call last):
  File "/usr/bin/yowsup-cli", line 5, in <module>
    pkg_resources.run_script('yowsup2==2.4.48', 'yowsup-cli')
  <…..>
OSError: [Errno 13] Permission denied: '/var/www/.yowsup'

27 марта 2016
После нескольких месяцев работы при отправке сообщения вдруг стал получать ошибку:
# yowsup-cli demos -c yowsup-cli.config -M -s 7917XXXXXXX "Текст сообщения"
/usr/lib/python2.6/site-packages/yowsup2-2.4.48-py2.6.egg/yowsup/demos/sendclient/stack.py:56: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
  print("Authentication Error: %s" % e.message)
Authentication Error: not-authorized
Попытался повторно авторизоваться. Выдается ошибка:
# python yowsup-cli registration --requestcode sms --phone 7917XXXXXXX --cc 7 --mcc 250 --mnc 01
INFO:yowsup.common.http.warequest:{"status":"fail","reason":"old_version"}
INFO:yowsup.common.http.warequest:{"status":"fail","reason":"old_version"}
status: fail
reason: old_version

Установка новой версии Yowsup 2

# cd /usr/src/
Удаляем старые версии:
# rm -fR yowsup-master/
# rm -fR master
Качаем свежую версию и устанавливаем:
# wget https://github.com/tgalal/yowsup/archive/master.zip
# unzip master
# cd yowsup-master/
# python setup.py install
Закончится установка выводом:
Finished processing dependencies for yowsup2==2.4.48
Конфигурационные файлы после переустановки удалились.
Далее выполняем рекомендации, взятые отсюда: http://stackoverflow.com/questions/35877803/yowsup-old-version-error 
Открываем файл env_android.py:
# nano /usr/lib/python2.6/site-packages/yowsup2-2.4.48-py2.6.egg/yowsup/env/env_android.py
И меняем содержание переменных _MD5_CLASSES, _KEY  и _VERSION
Должно быть так:
    _MD5_CLASSES = "7UDPOXwpiLBvEjT8uNwsuA=="
    _KEY = "eQV5aq/Cg63Gsq1sshN9T3gh+UUp0wIw0xgHYT1bnCjEqOJQKCRrWxdAe2yvsDeCJL+Y4G3PRD2HUF7oUgiGo8vGlNJOaux26k+A2F3hj8A="
_VERSION = "2.12.440"
Затем открываем файл yowsup/registration/coderequest.py:
# nano /usr/lib/python2.6/site-packages/yowsup2-2.4.48-py2.6.egg/yowsup/registration/coderequest.py
Здесь вместо строк:
from yowsup.env import S40YowsupEnv
CURRENT_ENV = S40YowsupEnv()
пишем:
from yowsup.env import AndroidYowsupEnv
CURRENT_ENV = AndroidYowsupEnv()
То же делаем в файле warequest.py
# nano /usr/lib/python2.6/site-packages/yowsup2-2.4.48-py2.6.egg/yowsup/common/http/warequest.py

Повторная регистрация
# yowsup-cli registration --requestcode sms --phone 7917XXXXXXX --cc 7 --mcc 250 --mnc 01
INFO:yowsup.common.http.warequest:{"status":"sent","length":6,"method":"sms","retry_after":65,"sms_wait":65,"voice_wait":65}
status: sent
retry_after: 65
length: 6
method: sms
Повторно подтверждаем регистрацию
# yowsup-cli registration --register 240-411 --phone 7917XXXXXXX --cc 7
INFO:yowsup.common.http.warequest:{"status":"ok","login":"7917XXXXXXX","type":"existing","pw":"jv5p/tEC5z61pkwQ0MwzjDMVn2M=","expiration":4444444444.0,"kind":"free","price":"33,00 \u0440\u0443\u0431.","cost":"33.00","currency":"RUB","price_expiration":1462183400}
status: ok
kind: free
pw: jv5p/tEC5z61pkwQ0MwzjDMVn2M=
price: 33,00 руб.
price_expiration: 1462183400
currency: RUB
cost: 33.00
expiration: 4444444444.0
login: 7917XXXXXXX
type: existing

Создаем конфигурационный файл 
# touch /usr/src/yowsup-master/yowsup-cli.config
# nano /usr/src/yowsup-master/yowsup-cli.config
и пишем в него:
cc=7
phone=7917XXXXXXX
password=jv5p/tEC5z61pkwQ0MwzjDMVn2M=

Отправка сообщений

К сожалению у меня так и  не получилось отправить сообщение. Все заканчивалось сообщением о неудачной авторизации.
# yowsup-cli demos -c /usr/src/yowsup-master/yowsup-cli.config -M -s 7917XXXXXXX "Авария на сети "
/usr/lib/python2.6/site-packages/yowsup2-2.4.48-py2.6.egg/yowsup/demos/sendclient/stack.py:56: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
  print("Authentication Error: %s" % e.message)
Authentication Error: not-authorized

Промучившись несколько дней я так и не нашел решения. Весь вышеприведенный текст поэтому может оказаться бесполезным. Написал его для того что бы помнить, что я делал и может быть когда-то вернусь к этой теме. 
Если кто-то знает, как исправить ситуацию – напишите, буду рад. 



4 комментария:

  1. При регистрации происходит ошибка

    INFO:yowsup.common.http.warequest:b'{"status":"fail","reason":"old_version"}\n'
    status: b'fail'
    reason: b'old_version'

    ОтветитьУдалить
    Ответы
    1. Может нужно попробовать установить самую новую версию Yowsup 2

      Удалить
    2. Провел процедуру установки новой версии yowsup. Описал это в блоге. Но к сожалению не добился успеха в отправке сообщений.

      Удалить
  2. Настроил, отправил сообщение, на следующий день ошибка регистрации. При попытке подключения этого номера через родное приложение, выдал сообщение, что аккаунт отключен. Написал в техподдержку. Ответили, что использовать можно только официальные приложения watsapp, и аккаунт заблокирован из-за использования стороннего ПО.

    ОтветитьУдалить