Библиотека Python для административного API Shopify
Вам необходимо зарегистрироваться в качестве партнера на панели инструментов Shopify Partners, чтобы вы могли создавать приложения Shopify и управлять ими.
Чтобы легко установить или обновить до последней версии, используйте pip.
pip install --upgrade ShopifyAPI
Сначала создайте новое приложение на панели инструментов партнеров и получите свой ключ API и секретный ключ API.
Затем нам нужно предоставить эти ключи классу сеанса Shopify, чтобы он знал, как аутентифицироваться.
import shopify
shopify . Session . setup ( api_key = API_KEY , secret = API_SECRET )
Чтобы получить доступ к данным магазина, приложениям необходим токен доступа из этого конкретного магазина. Нам необходимо пройти аутентификацию в этом магазине с помощью OAuth, которую мы можем запустить следующим образом:
shop_url = "SHOP_NAME.myshopify.com"
api_version = '2024-07'
state = binascii . b2a_hex ( os . urandom ( 15 )). decode ( "utf-8" )
redirect_uri = "http://myapp.com/auth/shopify/callback"
scopes = [ 'read_products' , 'read_orders' ]
newSession = shopify . Session ( shop_url , api_version )
auth_url = newSession . create_permission_url ( scopes , redirect_uri , state )
# redirect to auth_url
Как только продавец примет предложение, магазин перенаправит владельца на redirect_uri
вашего приложения с параметром «код». Это временный токен, который приложение может обменять на токен постоянного доступа. Вам следует сравнить состояние, которое вы предоставили выше, с тем, которое вы получили обратно, чтобы убедиться в правильности запроса. Теперь мы можем обменять код на access_token, когда вы получите запрос от shopify в обработчике обратного вызова:
session = shopify . Session ( shop_url , api_version )
access_token = session . request_token ( request_params ) # request_token will validate hmac and timing attacks
# you should save the access token now for future use.
Теперь вы готовы отправлять авторизованные запросы API в свой магазин!:
session = shopify . Session ( shop_url , api_version , access_token )
shopify . ShopifyResource . activate_session ( session )
shop = shopify . Shop . current () # Get the current shop
product = shopify . Product . find ( 179761209 ) # Get a specific product
# execute a graphQL call
shopify . GraphQL (). execute ( "{ shop { name id } }" )
Альтернативно вы можете использовать temp для инициализации сеанса и выполнения команды:
with shopify . Session . temp ( shop_url , api_version , token ):
product = shopify . Product . find ()
Лучше всего очищать сеанс, когда вы закончите. Временный сеанс делает это автоматически:
shopify . ShopifyResource . clear_session ()
Частные приложения использовать немного быстрее, поскольку OAuth не требуется. Вы можете создать частное приложение в Shopify Merchant Admin. Вы можете использовать пароль частного приложения в качестве access_token
:
session = shopify . Session ( shop_url , api_version , private_app_password )
shopify . ShopifyResource . activate_session ( session )
# ...
shopify . ShopifyResource . clear_session ()
with shopify . Session . temp ( shop_url , api_version , private_app_password ):
shopify . GraphQL (). execute ( "{ shop { name id } }" )
Примечание. Ваше приложение должно быть общедоступным, чтобы можно было протестировать процесс выставления счетов. Для тестирования в магазине разработки используйте флаг 'test': True
application_charge = shopify . ApplicationCharge . create ({
'name' : 'My public app' ,
'price' : 123 ,
'test' : True ,
'return_url' : 'https://domain.com/approve'
})
# Redirect user to application_charge.confirmation_url so they can approve the charge
return_url
с параметром charge_id
( Примечание: это действие больше не требуется, если списание создано с помощью API версии 2021-01 или новее ). charge = shopify . ApplicationCharge . find ( charge_id )
shopify . ApplicationCharge . activate ( charge )
activated_charge
active
activated_charge = shopify . ApplicationCharge . find ( charge_id )
has_been_billed = activated_charge . status == 'active'
Рекомендуется иметь хотя бы базовое представление о принципах работы библиотеки pyactiveresource, которая представляет собой порт рельсов/ActiveResource на Python и от которой во многом зависит этот пакет.
Экземпляры ресурсов pyactiveresource
сопоставляются с ресурсами RESTful в Shopify API.
pyactiveresource
предоставляет методы жизненного цикла для создания, поиска, обновления и удаления ресурсов, которые эквивалентны HTTP-глаголам POST
, GET
, PUT
и DELETE
.
product = shopify . Product ()
product . title = "Shopify Logo T-Shirt"
product . id # => 292082188312
product . save () # => True
shopify . Product . exists ( product . id ) # => True
product = shopify . Product . find ( 292082188312 )
# Resource holding our newly created Product object
# Inspect attributes with product.attributes
product . price = 19.99
product . save () # => True
product . destroy ()
# Delete the resource from the remote server (i.e. Shopify)
Вот еще один пример получения списка открытых ордеров с использованием определенных параметров:
new_orders = shopify . Order . find ( status = "open" , limit = "50" )
Некоторые ресурсы, такие как Fulfillment
имеют префикс родительского ресурса в Shopify API (например, orders/450789469/fulfillments/255858046
). Для взаимодействия с этими ресурсами необходимо в запросе указать идентификатор родительского ресурса.
shopify . Fulfillment . find ( 255858046 , order_id = 450789469 )
Этот пакет также включает скрипт shopify_api.py
, упрощающий открытие интерактивной консоли для использования API в магазине.
shopify_api.py add yourshopname
shopify_api.py console
shopify_api.py help
Эта библиотека также поддерживает новый API GraphQL от Shopify. Процесс аутентификации идентичен. После активации сеанса просто создайте новый клиент Graphql и используйте execute
для выполнения запроса.
result = shopify . GraphQL (). execute ( '{ shop { name id } }' )
Вы можете выполнять более сложные операции, используя variables
и параметры operation_name
команды execute
.
Например, в этом документе GraphQL используется фрагмент для создания двух именованных запросов — один для одного заказа, а другой для нескольких заказов:
# ./order_queries.graphql
fragment OrderInfo on Order {
id
name
createdAt
}
query GetOneOrder ( $order_id : ID ! ){
node ( id : $order_id ){
... OrderInfo
}
}
query GetManyOrders ( $order_ids : [ ID ] ! ){
nodes ( ids : $order_ids ){
... OrderInfo
}
}
Теперь вы можете выбрать, какую операцию выполнить:
# Load the document with both queries
document = Path ( "./order_queries.graphql" ). read_text ()
# Specify the named operation to execute, and the parameters for the query
result = shopify . GraphQL (). execute (
query = document ,
variables = { "order_id" : "gid://shopify/Order/12345" },
operation_name = "GetOneOrder" ,
)
python setup.py sdist
pip install --upgrade dist/ShopifyAPI- * .tar.gz
Примечание. Используйте сценарий bin/shopify_api.py
при запуске из дерева исходного кода. Он добавит каталог lib в начало sys.path, поэтому установленная версия не будет использоваться.
pip install setuptools --upgrade
python setup.py test
Поддержка нумерации страниц на основе курсора была добавлена в версии 6.0.0.
import shopify
page1 = shopify . Product . find ()
if page1 . has_next_page ():
page2 = page1 . next_page ()
# to persist across requests you can use next_page_url and previous_page_url
next_url = page1 . next_page_url
page2 = shopify . Product . find ( from_ = next_url )
Предварительная фиксация настраивается как действие GitHub, которое запускается по запросам на включение и отправляет данные в main
ветку. Если вы хотите запускать предварительную фиксацию локально, установите ее и настройте сценарии git-перехвата.
pip install -r requirements.txt
pre-commit install
На данный момент нет поддержки: