PHP API调用适用于本地主机,邮递员,但不适用于实时网站

时间:2020-04-03 19:40:01

标签: php api web localhost

我是php的初学者,并且有一个我想从中读取数据的API。在我的本地主机上,它可以正常工作,并且所有输出均符合预期。 Postman应用程序也是如此。当我从本地主机而不是本地API访问Web API时,它甚至可以工作。但是,只要我尝试在实时网站上获得结果,它就会返回NULL。

注意:它是一个WordPress网站。 Localhost是通过Xampp完成的。通过SiteGround在线托管。我过去曾做过这项工作,但我不知道突然停止工作的情况(也许我做了些改动)。 API是具有预配置API的WordPress许可证管理器插件。域名/ IP /和客户机密不是原始的。

#!/bin/usr/env python
# ===========================================================
# Created By: Richard Barrett
# Organization: DVISD
# DepartmenT: Data Services
# Purpose: Skyward Reports
# Date: 04/03/2020
# ===========================================================
import selenium
import shutil
import xlsxwriter
import os
import unittest
import requests
import subprocess
import getpass
import platform
import socket
import ssl
import pynput
import logging
import time 
from pynput.keyboard import Key, Controller
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait 
from datetime import date

decrypt = "gpg --output secrets.json --decrypt secrets.gpg" 

if os.path.exists("secrets.gpg"):
      returned_value = subprocess.call(decrypt, shell=True)
else:
        print("The file does not exist!")
        print("You should probably create a secret!")
        print("gpg --output filename.gpg --encrypt filename.json")

import json
with open('secrets.json','r') as f:
      config = json.load(f)

# Definitions
# find_elements_by_name
# find_elements_by_xpath
# find_elements_by_link_text
# find_elements_by_partial_link_text
# find_elements_by_tag_name
# find_elements_by_class_name
# find_elements_by_css_selector

# System Variables
today = date.today()
date = today.strftime("%m/%d/%Y")
node = platform.node()
system = platform.system()
username = getpass.getuser()
version = platform.version()
keyboard = Controller()

# Upload Path Variables 
file_input_inactive_users = os.path.abspath("<insert_file_path>")

# URL Variables 
login_url = ''
redirect_url = ''
reports_scheduler_url = ''
custom_reports_url = ''

# Check for Version of Chrome

# WebDriver Path for OS.System
if platform.system() == ('Windows'):
    browser = webdriver.Chrome("C:\Program Files (x86)\Google\Chrome\chromedriver.exe")
elif platform.system() == ('Linux'):
    browser = webdriver.Chrome(executable_path='/home/rbarrett/Drivers/Google/Chrome/chromedriver_linux64/chromedriver')
elif platform.system() == ('Darwin'):
    browser = webdriver.Chrome(executable_path='~/Drivers/Google/Chrome/chromedriver_mac64/chromedriver')
else:
    print("Are you sure you have the Selenium Webdriver installed in the correct path?")

# TearDown Method
def tearDown(self):
    self.browser.close()

# ShutDown Method 
def shutDown(self):
    self.browser.quit()

# Parent URL
#browser.get(config['URL']['target_url'])
#browser.get("https://skyward-student.del-valle.k12.tx.us/scripts/wsisa.dll/WService=wsEAplus/seplog01.w?nopopup=true")
#options.addArguments("--ignore-certificate-errors")
browser.get("https://skyward-dev.del-valle.k12.tx.us/scripts/wsisa.dll/WService=wsEAplusTrn/seplog01.w?nopopup=true")
time.sleep(5)

# Click on Advanced Button for Certificate Error
# XPATH //*[@id='details-button']
element = WebDriverWait(browser, 20).until(
            EC.element_to_be_clickable((By.XPATH, "//*[@id='details-button']")))
element.click();

# Click on Proceed
# XPATH //*[@id'proceed-link']
element = WebDriverWait(browser, 20).until(
                    EC.element_to_be_clickable((By.ID, "proceed-link")))
element.click();
time.sleep(10)

# Credentials NEEDS UNIT TEST
username = browser.find_element_by_id("login")
password = browser.find_element_by_id("password")
username.send_keys(config['user']['name'])
password.send_keys(config['user']['password'])

# Authentication submit.click()
# For XPATH = //*[@id='bLogin']
element = WebDriverWait(browser, 20).until(
    EC.element_to_be_clickable((By.XPATH, "//*[@id='bLogin']")))
element.click();
print("Logging into Skyward!")
print("Authenticated")

# Click and Span Skyward Contact Access
# Adminsitration XPATH = //*[@id='nav_ContactAccess']/span
element = WebDriverWait(browser, 20).until(
            EC.element_to_be_clickable((By.XPATH, "//*[@id='nav_ContactAccess']/span")))
element.click();

# Click on Secured Users Access
# Adminsitration XPATH = //*[@id='nav_SecuredUserSuperUser']/span
element = WebDriverWait(browser, 20).until(
            EC.element_to_be_clickable((By.XPATH, "//*[@id='nav_SecuredUserSuperUser']/span")))
element.click();

# Click on id="browsetool_export"
# Opens Options to Download Report
# XPATH = //*[@id='browsetool_export']
element = WebDriverWait(browser, 20).until(
    EC.element_to_be_clickable((By.XPATH, "//*[@id='browsetool_export']")))
element.click();

# Click on .CSV Radio Button
# XPATH = //*[@id='ExCOptCSV']
element = WebDriverWait(browser, 20).until(
    EC.element_to_be_clickable((By.XPATH, "//*[@id='ExCOptCSV']")))
element.click();

# Click on Export Button
# XPATH = //*[@id='bExport']
element = WebDriverWait(browser, 20).until(
    EC.element_to_be_clickable((By.XPATH, "//*[@id='bExport']")))
element.click();

# Click on id="browsetool_export"
# Opens Options to Download Report
# XPATH = //*[@id='browsetool_export']
element = WebDriverWait(browser, 20).until(
    EC.element_to_be_clickable((By.XPATH, "//*[@id='browsetool_export']")))
element.click();

# Click on .xlsx Radio Button
# XPATH = //*[@id='ExCOptXLSX']
element = WebDriverWait(browser, 20).until(
    EC.element_to_be_clickable((By.XPATH, "//*[@id='ExCOptXLSX']")))
element.click();

# Click on Export Button 
# XPATH  = //*[@id='bExport']
element = WebDriverWait(browser, 20).until(
    EC.element_to_be_clickable((By.XPATH, "//*[@id='bExport']")))
element.click();
time.sleep(20)

# Click on Download Export Button
# XPATH = //*[@id='printMsgBtn1']
element = WebDriverWait(browser, 20).until(
    EC.element_to_be_clickable((By.XPATH, "//*[@id='printMsgBtn1']")))
element.click();

# Click on Run Button 
# Run Button XPATH = 
# Delete Unencrypted JSON File
if os.path.exists("secrets.json"):
  os.remove("secrets.json")
  print("The file was removed and everything is clean!")
else:
  print("The file does not exist")


# Close Browser Session Gracefully              
print("The Export was successfull!")
#browser.quit()

在我的本地主机上,此代码产生此响应,而这正是我需要的:

$url = "https://example.com/wp-json/lmfwc/v2/licenses?consumer_key=ck_xxxx&consumer_secret=cs_yyy";

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => $url,
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "", 
  CURLOPT_FOLLOWLOCATION => True,
  CURLOPT_HTTPHEADER =>array (
     'Accept: application/json'),
  CURLOPT_SSL_VERIFYHOST => false,
  CURLOPT_SSL_VERIFYPEER => false,
));

$response = curl_exec($curl);
print_r($response) ?> <br><br> <?php ;
$json_response =json_encode($response);
print_r($json_response) ?> <br><br> <?php ;
$info_display = curl_getinfo($curl);
print_r ($info_display); ?> <br><br> <?php 
$array_response = json_decode($response);
print_r($array_response); ?> <br> <br><?php 
$err = curl_error($curl);
var_dump($err); ?> <br> <br><?php 
curl_close($curl);

我的实时网站上的相同代码崩溃。所以我需要注释掉 > {"success":true,"data":{"id":"1","orderId":null,"productId":"2037","licenseKey":"1232edwfsd2","expiresAt":null,"validFor":"14","source":"2","status":"3","timesActivated":"0","timesActivatedMax":"1","createdAt":"2020-02-06 > 20:35:56","createdBy":"1","updatedAt":"2020-02-08 > 12:34:20","updatedBy":"1"}} > > "{\"success\":true,\"data\":{\"id\":\"1\",\"orderId\":null,\"productId\":\"2037\",\"licenseKey\":\"1232edwfsd2\",\"expiresAt\":null,\"validFor\":\"14\",\"source\":\"2\",\"status\":\"3\",\"timesActivated\":\"0\",\"timesActivatedMax\":\"1\",\"createdAt\":\"2020-02-06 > 20:35:56\",\"createdBy\":\"1\",\"updatedAt\":\"2020-02-08 > 12:34:20\",\"updatedBy\":\"1\"}}" > > Array ( [url] => > https://example.com/wp-json/lmfwc/v2/licenses?consumer_key=ck_xxx&consumer_secret=cs_yyy > [content_type] => application/json; charset=UTF-8 [http_code] => 200 > [header_size] => 657 [request_size] => 250 [filetime] => -1 > [ssl_verify_result] => 0 [redirect_count] => 0 [total_time] => > 2.164129 [namelookup_time] => 0.000694 [connect_time] => 0.256472 [pretransfer_time] => 0.40321 [size_upload] => 0 [size_download] => > 205 [speed_download] => 94 [speed_upload] => 0 > [download_content_length] => -1 [upload_content_length] => -1 > [starttransfer_time] => 2.164067 [redirect_time] => 0 [redirect_url] > => [primary_ip] => *censored by author* [certinfo] => Array ( ) [primary_port] => 443 [local_ip] => *censored by author* [local_port] => *censored by author* [http_version] => 3 [protocol] => 2 [ssl_verifyresult] => 0 [scheme] > => HTTPS [appconnect_time_us] => 403002 [connect_time_us] => 256472 [namelookup_time_us] => 694 [pretransfer_time_us] => 403210 > [redirect_time_us] => 0 [starttransfer_time_us] => 2164067 > [total_time_us] => 2164129 ) > > stdClass Object ( [success] => 1 [data] => stdClass Object ( [id] => 1 > [orderId] => [productId] => 2037 [licenseKey] => 1232edwfsd2 > [expiresAt] => [validFor] => 14 [source] => 2 [status] => 3 > [timesActivated] => 0 [timesActivatedMax] => 1 [createdAt] => > 2020-02-06 20:35:56 [createdBy] => 1 [updatedAt] => 2020-02-08 > 12:34:20 [updatedBy] => 1 ) ) > > string(0) "" > > status: 3 times activated: 0 times activated max: 1 last update: > 2020-02-08 12:34:20

那我就能得到这个结果:

//print_r($response) ?> <br><br> <?php ;

在Google Chrome浏览器的“开发者控制台”的“网络”标签中,我可以看到这一点。所有请求返回状态200:

> "<\/meta><\/head><\/html>"
> 
> Array ( [url] =>
> https://example.com/wp-json/lmfwc/v2/licenses?consumer_key=ck_xxx&consumer_secret=cs_yyy
> [content_type] => text/html [http_code] => 200 [header_size] => 277
> [request_size] => 254 [filetime] => -1 [ssl_verify_result] => 0
> [redirect_count] => 0 [total_time] => 0.01762 [namelookup_time] =>
> 0.000747 [connect_time] => 0.000873 [pretransfer_time] => 0.016955 [size_upload] => 0 [size_download] => 96 [speed_download] => 5647
> [speed_upload] => 0 [download_content_length] => -1
> [upload_content_length] => -1 [starttransfer_time] => 0.017479
> [redirect_time] => 0 [redirect_url] => [primary_ip] => *censored by author*
> [certinfo] => Array ( ) [primary_port] => 443 [local_ip] => *censored by author*
> [local_port] => *censored by author* [http_version] => 3 [protocol] => 2
> [ssl_verifyresult] => 0 [scheme] => HTTPS [appconnect_time_us] =>
> 16862 [connect_time_us] => 873 [namelookup_time_us] => 747
> [pretransfer_time_us] => 16955 [redirect_time_us] => 0
> [starttransfer_time_us] => 17479 [total_time_us] => 17620 )
> 
> 
> 
> string(0) ""
> 
> status: times activated: times activated max: last update:

编辑:将以下代码添加到我的php代码段的开头,该代码段是通过php-snipped插件添加到wordpress的:

Request URL: https://example.com/check-in/
Request Method: GET
Status Code: 200 
Remote Address: *censored by author*
Referrer Policy: no-referrer-when-downgrade
cache-control: no-transform, no-cache, no-store, must-revalidate
content-encoding: gzip
content-type: text/html; charset=UTF-8
date: Fri, 03 Apr 2020 20:01:50 GMT
expires: Wed, 11 Jan 1984 05:00:00 GMT
host-header: 192fc2e7e50945beb8231a492d6a8024
link: <https://example.com/wp-json/>; rel="https://api.w.org/", <https://example.com/?p=2463>; rel=shortlink
server: nginx
status: 200
vary: Accept-Encoding
x-httpd: 1
x-proxy-cache: BYPASS
x-proxy-cache-info: D NC:200000 UP:1
:authority: example.com
:method: GET
:path: /check-in/
:scheme: https
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9,de-DE;q=0.8,de;q=0.7,nl-NL;q=0.6,nl;q=0.5,fr;q=0.4
cache-control: max-age=0
cookie: *censored by author*
referer: https://example.com/
sec-fetch-dest: document
sec-fetch-mode: navigate
sec-fetch-site: same-origin
sec-fetch-user: ?1
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36

我在前端将其返回:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

3 个答案:

答案 0 :(得分:0)

您应该将以下行放入脚本的第一行。将显示所有错误,然后,应在生产环境中删除此行

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

答案 1 :(得分:0)

在wordpress API可以输出之前,您似乎正在向输出缓冲区中写入一些内容。

我会检查您在localhost上的环境是否匹配生产。例如插件,主题文件和wordpress核心。您的主题文件可能在标题中回显了某些内容。

其他建议是:

如果邮递员正在制作产品,则您的cUrl设置存在问题

这是一个SSL问题-您已禁用在自己的网址上验证SSL-假设您的本地主机上没有SSL,但是Siteground阻止了来自本身未使用SSL的SSL网站的网址请求。还需要将编码集设置为空字符串吗?

答案 2 :(得分:0)

已解决,但我必须承认我不知道最终解决了什么。但这与Siteground问题无关。最后尝试了一千件事,然后我删除了应该运行php代码的整个子页面。我创建了一个新页面,并尝试了一遍又一遍,它仍然有效。很奇怪,但是感谢您的提示和技巧。

相关问题