मैं Kivy's UrlRequest का उपयोग करके एक वेबसाइट को परिमार्जन करने का प्रयास कर रहा हूं। जब मैं एंड्रॉइड से ऐप चलाता हूं तो कोड UrlRequest फ़ंक्शन में प्रवेश करता है और कभी भी कोई जानकारी नहीं देता है कि यह विफल हो गया, कोई त्रुटि हुई या सफलता मिली। मैं लॉग आउटपुट के लिए "सुन" कैसे पता लगा सकता हूं कि कुछ भी क्यों नहीं होता है? वैकल्पिक रूप से, मैं अपने UrlRequest कोड में क्या गलत कर रहा हूँ?

मैंने निम्नलिखित कोशिश की है:

1] यह देखने के लिए कि कोई आउटपुट है या नहीं, on_success, on_progress, on_error और on_failure फ़ंक्शंस को परिभाषित किया गया है।

2] अलग-अलग chunk_size, debug, decode और timeout मानों के साथ एक सेटिंगपैनल बनाया ताकि यह देखा जा सके कि जब मैं उन्हें बदलता हूं तो इससे कोई फर्क पड़ता है या नहीं।

3] आयातित किवी का LoggerHistory फ़ंक्शन यह देखने के लिए कि कहीं कोई त्रुटि तो नहीं है।

4] टर्मिनल में buildozer android logcat आउटपुट को देखा कि क्या होता है जब मैं अनुरोध बटन दबाता हूं।

5] यूआरएल को https://www.google.com से http://www.google.com में बदला गया

6] एन्कोडिंग को 'Latin-1' से 'utf-16' में बदल दिया और फिर से वापस आ गया।

7] यह देखने के लिए कि क्या मुझे कुछ मिल सकता है, Urllib.request लाइब्रेरी का उपयोग करके एक फ़ंक्शन जोड़ा और इसने मुझे निम्नलिखित त्रुटि दी:

07-30 21:51:09.933  9393  9417 I python  :  urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1051)>

UrlRequest कोड

    def req_url(self, *args):
        url_chnk = self.the.config.getint('urlreqsettings', 'optionschunk')
        tme = self.the.config.getint('urlreqsettings', 'inttime')
        dcode = self.the.config.getboolean('urlreqsettings', 'booldecode')
        dbug = self.the.config.getboolean('urlreqsettings', 'booldebug')
        self.ids.result_success.color = (0,0,1,1)
        self.ids.result_success.text = "Busy..."
        # self.ids.conn_status.text = str(url_chnk)
        the_request = UrlRequest(self.the._url,on_progress=self.on_progress, on_success=self.on_success, on_error=self.on_error, on_failure=self.on_failure, chunk_size=url_chnk, timeout=tme, debug=dbug, decode=dcode)
        self.ids.req_info.text = str(the_request.is_finished) + " - " + str(the_request.chunk_size)
    def on_success(self, the_request, result, *args):
        self.ids.req_info.text = str(the_request.is_finished) + " - " + str(the_request.chunk_size)
        # print(the_request.resp_headers)
        if self.prog_circle:
            self.loader.dismiss()
            self.ids.result_success.color = (0,0,1,1)
            self.ids.result_success.text = "Successful UrlRequest!"
            self.ids.get_result.text = ""
            self.ids.get_result.text = str(result, encoding='Latin-1')
            self.prog_circle = False

मेरा यूआरएल जिसका मैं उपयोग करता हूं

config.setdefaults('myurl', {
            'url': 'https://www.google.com'})

Ouput Logcat जब किवी के UrlRequest फ़ंक्शन को कॉल करने पर on_release बटन कॉल करता है

07-30 21:44:42.795  2122  2122 D NetworkController.WifiSignalController: Change in state from: connected=true,enabled=true,level=4,inetCondition=1,iconGroup=IconGroup(Wi-Fi Icons),activityIn=true,activityOut=true,rssi=-51,lastModified=07-30 21:43:46,ssid="TP-Link_4837_5G",isTransient=false,statusLabel=null
07-30 21:44:42.795  2122  2122 D NetworkController.WifiSignalController:    to: connected=true,enabled=true,level=4,inetCondition=1,iconGroup=IconGroup(Wi-Fi Icons),activityIn=false,activityOut=false,rssi=-51,lastModified=07-30 21:43:46,ssid="TP-Link_4837_5G",isTransient=false,statusLabel=null
07-30 21:44:42.861  1685  1748 E LightsService: Light requested not available on this device. 2
07-30 21:44:43.792  1685  1987 D WifiTrafficPoller: TRAFFIC_STATS_POLL true Token 625 num clients 1
07-30 21:44:43.794  1685  1987 D WifiTrafficPoller:  packet count Tx=76508 Rx=110820
07-30 21:44:43.797  2122  2402 D MessengerImpl: <send> message = 1 ,msg.sendingUid = 1000 ,Handler = Handler (com.android.systemui.statusbar.policy.WifiSignalController$WifiHandler) {3efccc8}
07-30 21:44:43.800  2122  2122 D NetworkController.WifiSignalController: Change in state from: connected=true,enabled=true,level=4,inetCondition=1,iconGroup=IconGroup(Wi-Fi Icons),activityIn=false,activityOut=false,rssi=-51,lastModified=07-30 21:44:42,ssid="TP-Link_4837_5G",isTransient=false,statusLabel=null
07-30 21:44:43.800  2122  2122 D NetworkController.WifiSignalController:    to: connected=true,enabled=true,level=4,inetCondition=1,iconGroup=IconGroup(Wi-Fi Icons),activityIn=false,activityOut=true,rssi=-51,lastModified=07-30 21:44:42,ssid="TP-Link_4837_5G",isTransient=false,statusLabel=null
07-30 21:44:44.797  1685  1987 D WifiTrafficPoller: TRAFFIC_STATS_POLL true Token 625 num clients 1
07-30 21:44:44.799  1685  1987 D WifiTrafficPoller:  packet count Tx=76509 Rx=110820
07-30 21:44:45.117   728   868 D SDM     : DisplayBase::BuildLayerStackStats: LayerStack layer_count: 7, app_layer_count: 6, gpu_target_index: 6, display type: 0
07-30 21:44:45.419   728   868 I chatty  : uid=1000(system) HwBinder:728_2 identical 1 line
07-30 21:44:45.637   728   868 D SDM     : DisplayBase::BuildLayerStackStats: LayerStack layer_count: 7, app_layer_count: 6, gpu_target_index: 6, display type: 0
07-30 21:44:45.800  1685  1987 D WifiTrafficPoller: TRAFFIC_STATS_POLL true Token 625 num clients 1
07-30 21:44:45.802  1685  1987 D WifiTrafficPoller:  packet count Tx=76526 Rx=110835
07-30 21:44:45.803  2122  2402 D MessengerImpl: <send> message = 1 ,msg.sendingUid = 1000 ,Handler = Handler (com.android.systemui.statusbar.policy.WifiSignalController$WifiHandler) {3efccc8}
07-30 21:44:45.805  2122  2122 D NetworkController.WifiSignalController: Change in state from: connected=true,enabled=true,level=4,inetCondition=1,iconGroup=IconGroup(Wi-Fi Icons),activityIn=false,activityOut=true,rssi=-51,lastModified=07-30 21:44:43,ssid="TP-Link_4837_5G",isTransient=false,statusLabel=null
07-30 21:44:45.805  2122  2122 D NetworkController.WifiSignalController:    to: connected=true,enabled=true,level=4,inetCondition=1,iconGroup=IconGroup(Wi-Fi Icons),activityIn=true,activityOut=true,rssi=-51,lastModified=07-30 21:44:43,ssid="TP-Link_4837_5G",isTransient=false,statusLabel=null

उरलीब फ़ंक्शन बटन जारी होने पर ऊपुट लॉगकैट

07-30 21:51:09.902  9393  9417 I python  :  ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1051)
07-30 21:51:09.903  9393  9417 I python  :  
07-30 21:51:09.903  9393  9417 I python  :  During handling of the above exception, another exception occurred:
07-30 21:51:09.903  9393  9417 I python  :  
07-30 21:51:09.904  9393  9417 I python  :  Traceback (most recent call last):
07-30 21:51:09.904  9393  9417 I python  :    File "/home/dataleaf/Build_Environ/.buildozer/android/app/main.py", line 499, in <module>
07-30 21:51:09.905  9393  9417 I python  :    File "/home/dataleaf/Build_Environ/.buildozer/android/platform/build/build/python-installs/urlsign/kivy/app.py", line 855, in run
07-30 21:51:09.906  9393  9417 I python  :    File "/home/dataleaf/Build_Environ/.buildozer/android/platform/build/build/python-installs/urlsign/kivy/base.py", line 504, in runTouchApp
07-30 21:51:09.906  9393  9417 I python  :    File "/home/dataleaf/Build_Environ/.buildozer/android/platform/build/build/python-installs/urlsign/kivy/core/window/window_sdl2.py", line 746, in mainloop
07-30 21:51:09.907  9393  9417 I python  :    File "/home/dataleaf/Build_Environ/.buildozer/android/platform/build/build/python-installs/urlsign/kivy/core/window/window_sdl2.py", line 478, in _mainloop
07-30 21:51:09.908  9393  9417 I python  :    File "/home/dataleaf/Build_Environ/.buildozer/android/platform/build/build/python-installs/urlsign/kivy/base.py", line 342, in idle
07-30 21:51:09.909  9393  9417 I python  :    File "/home/dataleaf/Build_Environ/.buildozer/android/platform/build/build/python-installs/urlsign/kivy/base.py", line 327, in dispatch_input
07-30 21:51:09.909  9393  9417 I python  :    File "/home/dataleaf/Build_Environ/.buildozer/android/platform/build/build/python-installs/urlsign/kivy/base.py", line 293, in post_dispatch_input
07-30 21:51:09.910  9393  9417 I python  :    File "kivy/_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
07-30 21:51:09.911  9393  9417 I python  :    File "/home/dataleaf/Build_Environ/.buildozer/android/platform/build/build/python-installs/urlsign/kivy/uix/behaviors/button.py", line 179, in on_touch_up
07-30 21:51:09.920  9393  9417 I python  :    File "kivy/_event.pyx", line 703, in kivy._event.EventDispatcher.dispatch
07-30 21:51:09.922  9393  9417 I python  :    File "kivy/_event.pyx", line 1214, in kivy._event.EventObservers.dispatch
07-30 21:51:09.923  9393  9417 I python  :    File "kivy/_event.pyx", line 1098, in kivy._event.EventObservers._dispatch
07-30 21:51:09.925  9393  9417 I python  :    File "/home/dataleaf/Build_Environ/.buildozer/android/platform/build/build/python-installs/urlsign/kivy/lang/builder.py", line 64, in custom_callback
07-30 21:51:09.926  9393  9417 I python  :    File "<string>", line 179, in <module>
07-30 21:51:09.926  9393  9417 I python  :    File "/home/dataleaf/Build_Environ/.buildozer/android/app/main.py", line 300, in on_urllib_prog
07-30 21:51:09.927  9393  9417 I python  :    File "/home/dataleaf/Build_Environ/.buildozer/android/app/main.py", line 303, in url_library
07-30 21:51:09.928  9393  9417 I python  :    File "/home/dataleaf/Build_Environ/.buildozer/android/platform/build/build/other_builds/python3-libffi-openssl-sqlite3/armeabi-v7a__ndk_target_21/python3/Lib/urllib/request.py", line 222, in urlopen
07-30 21:51:09.929  9393  9417 I python  :    File "/home/dataleaf/Build_Environ/.buildozer/android/platform/build/build/other_builds/python3-libffi-openssl-sqlite3/armeabi-v7a__ndk_target_21/python3/Lib/urllib/request.py", line 525, in open
07-30 21:51:09.929  9393  9417 I python  :    File "/home/dataleaf/Build_Environ/.buildozer/android/platform/build/build/other_builds/python3-libffi-openssl-sqlite3/armeabi-v7a__ndk_target_21/python3/Lib/urllib/request.py", line 543, in _open
07-30 21:51:09.930  9393  9417 I python  :    File "/home/dataleaf/Build_Environ/.buildozer/android/platform/build/build/other_builds/python3-libffi-openssl-sqlite3/armeabi-v7a__ndk_target_21/python3/Lib/urllib/request.py", line 503, in _call_chain
07-30 21:51:09.931  9393  9417 I python  :    File "/home/dataleaf/Build_Environ/.buildozer/android/platform/build/build/other_builds/python3-libffi-openssl-sqlite3/armeabi-v7a__ndk_target_21/python3/Lib/urllib/request.py", line 1360, in https_open
07-30 21:51:09.932  9393  9417 I python  :    File "/home/dataleaf/Build_Environ/.buildozer/android/platform/build/build/other_builds/python3-libffi-openssl-sqlite3/armeabi-v7a__ndk_target_21/python3/Lib/urllib/request.py", line 1319, in do_open
07-30 21:51:09.933  9393  9417 I python  :  urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1051)>
07-30 21:51:09.933  9393  9417 I python  : Python for android ended.
07-30 21:51:10.229  1685  1987 D WifiTrafficPoller: TRAFFIC_STATS_POLL true Token 625 num clients 1
07-30 21:51:10.229  1685  1987 D WifiTrafficPoller:  packet count Tx=77858 Rx=112074
07-30 21:51:10.238  1685  1974 W InputDispatcher: channel '2fc1551 org.url_requesting.urlsign/org.kivy.android.PythonActivity (server)' ~ Consumer closed input channel or an error occurred.  events=0x9
07-30 21:51:10.238  1685  1974 E InputDispatcher: channel '2fc1551 org.url_requesting.urlsign/org.kivy.android.PythonActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
07-30 21:51:10.239  1685  4609 I ActivityManager: Process org.url_requesting.urlsign (pid 9393) has died: fore TOP 
07-30 21:51:10.240  1685  2993 I WindowManager: WIN DEATH: Window{2fc1551 u0 org.url_requesting.urlsign/org.kivy.android.PythonActivity}
07-30 21:51:10.240  1685  2993 W InputDispatcher: Attempted to unregister already unregistered input channel '2fc1551 org.url_requesting.urlsign/org.kivy.android.PythonActivity (server)'
07-30 21:51:10.240   648   648 I Zygote  : Process 9393 exited cleanly (255)
07-30 21:51:10.241  1685  1750 W libprocessgroup: kill(-9393, 9) failed: No such process
07-30 21:51:10.241  1685  1750 I libprocessgroup: Successfully killed process cgroup uid 10272 pid 9393 in 0ms
07-30 21:51:10.243  1685  4609 W ActivityManager: Force removing ActivityRecord{e32495c u0 org.url_requesting.urlsign/org.kivy.android.PythonActivity t6783}: app died, no saved state

अद्यतन

मैंने अपने url "https://orob.co.za" से "s" को फिर से हटा दिया, अनइंस्टॉल कर दिया मेरे फोन से पूरी तरह से ऐप और फिर से इंस्टॉल (अपडेट नहीं)। इस बार Urllib फ़ंक्शन ने निम्न त्रुटि दी:

07-30 22:15:10.961 10706 10730 I python  :  socket.timeout: timed out
07-30 22:15:10.961 10706 10730 I python  : Python for android ended.

जबकि Kivy UrlRequest फ़ंक्शन ने पहली बार on_progress फ़ंक्शन में प्रवेश किया। लेकिन अनुरोध सफल नहीं हुआ, केवल टाइम आउट हुआ।

अद्यतन और सफलता पर अद्यतन यद्यपि HTTP नहीं... S!

सफलता! मैंने इसे क्रैक किया। जब मैंने ऊपर [५] कोशिश की थी तो मैंने केवल अपने फोन पर ऐप को अपडेट किया था और इसे अनइंस्टॉल नहीं किया था। मैंने प्लॉट भी खो दिया था और डोमेन को शुरुआती परीक्षणों में इस्तेमाल किए गए डोमेन से अलग कर दिया था, जिसका मतलब था कि मुझे सही परिणाम मिले लेकिन गलत तथ्य। मैंने इसे वापस "http://www.google.com" में बदल दिया है और ऐप ने स्क्रैप वापस कर दिया है ( "लैटिन -1") UrlRequest और Urllib के लिए। बहुत बाहर निकल रहा है!

समस्या एसएसएल प्रमाणपत्र प्रतीत होती है। मेरे पास मेरी buidozer.spec फ़ाइल के हिस्से के रूप में ओपनएसएल है, तो यह एंड्रॉइड में एचटीटीपीएस के साथ क्यों काम नहीं कर रहा है!

अपडेट पर अपडेट पर अपडेट...

तो मेरी पिछली खोज सही है। "HTTPS: //..." url के लिए भी Kivy Urlrequest फ़ंक्शन पर प्रमाणपत्र सत्यापन विफल हो रहा है। अपने कोड को ट्विक करने के बाद मैंने पाया कि on_error फ़ंक्शन का error आउटपुट एक string है और बाइट जैसी वस्तु नहीं है, इसका मतलब है कि मैंने decoding एक स्ट्रिंग की कोशिश की जिसके कारण त्रुटि हुई और मेरे ऐप में त्रुटि आउटपुट को अवरुद्ध कर दिया:

[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1051)

प्रश्न संपादित

क्या कोई कृपया मदद कर सकता है कि मैं कैसे स्क्रैप से result वापस कर सकता हूं .. url से https के साथ?

2
Hmerman6006 30 जुलाई 2019, 02:02

1 उत्तर

सबसे बढ़िया उत्तर

मैं अपने स्वयं के प्रश्न का उत्तर दे रहा हूं क्योंकि मैंने अंततः इसे हल कर लिया है और मैं दूसरों को सूचित करने के किसी अन्य तरीके के बारे में सुनिश्चित नहीं हूं।
एसएसएल प्रमाणपत्र प्रश्न के इस मंच पर कई उत्तर हैं, लेकिन मेरे प्रश्न को हल करने वाली जानकारी ज्यादातर टिप्पणियां हैं।

समाधान

पायथन 3.6.8 और किवी 1.11.0 का उपयोग करना

चरण 1> मुझे pip3 install requests को certifi अजगर पुस्तकालय प्राप्त करना था।
@Petar Luktina टिप्पणियाँ देखें "किवी में HTTPS अनुरोध"

चरण 2> ca_file=certifi.where() पैरामीटर को अपने UrlRequest() में जोड़ें। एक अतिरिक्त के रूप में मैंने verify=True पैरामीटर जोड़ा।
देखें @Erik टिप्पणियाँ "Kivy UrlRequest with https"

चरण 3> एप्लिकेशन आवश्यकताओं के रूप में buildozer.spec फ़ाइल में certifi and openssl जोड़ें, अन्यथा आपको एक ModuleNotFoundError: No module named '_ctypes' मिलेगा। त्रुटि एक स्पष्ट रूप से आयातित पुस्तकालय के कारण है जिसे .spec फ़ाइल में घोषित नहीं किया गया है या पहले से घोषित पैकेज का हिस्सा नहीं है

चरण 4> on_success पैरामीटर को संभालने के लिए फ़ंक्शन जोड़ें (आवश्यक नहीं है लेकिन यह मेरे लिए काम करता है)।

मेरा कोडित उत्तर:

import certifi as cfi
from kivy.network.urlrequest import UrlRequest

    def req_url(self, *args):
        the_request = UrlRequest(self.the._url, on_success=self.on_success, 
                               on_error=self.on_error, on_failure=self.on_failure,
                                     ca_file=cfi.where(), verify=True)

प्रेस्टो! यह अब एंड्रॉइड पर काम करता है।

0
Hmerman6006 4 अगस्त 2019, 15:47