how to Streaming on chat interface using Gradio? | Gradio + OpenAI Streaming mode

how to Streaming on chat interface using Gradio? | Gradio + OpenAI Streaming mode

OpenAi 官方的Stream教學 https://platform.openai.com/docs/api-reference/chat/streaming
Gradio 官方的Stream教學 https://www.gradio.app/guides/creating-a-custom-chatbot-with-blocks#add-streaming-to-your-chatbot
兩者結合一下就可以完成Stream, 效果如下

How to Bypass CAPTCHA With Selenium & Python

How to Bypass CAPTCHA With Selenium & Python

Cloudflare blocks out threats and bad bots and, unfortunately for us, it also assumes all non-whitelisted bot traffic is malicious. This makes web scraping difficult since there’s a good chance our scraper will be denied access to a Cloudflare-protected web page.

One of the best ways to solve this is by using a headless browser, like Selenium, because it’s capable of imitating the activities of a real user. In this guide, we’ll discuss the most effective method to bypass Cloudflare with Selenium.

Let’s jump right in!

What Is Selenium

Selenium is a Python library used for automating web browsers and scraping web pages. Selenium extensions emulate user interaction and provide interactivity in various ways, like enabling the clicking of buttons, scrolling the page, executing custom JavaScript code, simulating user inputs and so on. It automates processes on several browsers, including Firefox and Chrome, using the Webdriver protocol.

What Is Cloudflare and How Does It Work

Cloudflare is a web performance and security company that works to secure and optimize websites and applications. When it comes to security, Cloudflare offers a Web Application Firewall (WAF) that is capable of defending against web attacks, such as cross-site scripting (XSS) and DDoS attacks.

Does Cloudflare Detect Selenium

Unfortunately for us, Cloudflare Bot Management is capable of detecting Selenium. Cloudflare stops malicious HTTP traffic from moving on to the server and it performs security checks to mitigate Layer 7 (application layer) of DDoS attacks. These security checks would identify a Selenium webDriver as a bot.

On a site running with Cloudflare, an interstitial page comes up for 5 seconds. If the checks on the HTTP traffic pass as genuine, the server redirects the user to the page. If not, the page stays there and shows a CAPTCHA.

How Does Cloudflare Block Bots?

Cloudflare’s bot detection techniques can be classified into two categories: passive and active. Passive bot detection uses backend server detection techniques, like TLS fingerprinting, HTTP request headers and IP address reputation. Active bot detection happens on the client side, including CAPTCHAs, event tracking, canvas fingerprinting and others.

Can Selenium Bypass Cloudflare?

Yes! It’s possible to bypass Cloudflare in Selenium. While using base Selenium might not be enough, it’s possible to install extended Selenium libraries to help you avoid Cloudflare detection.

First, let’s run through a quick example to show you why base Selenium isn’t enough. We’ll be using DataCamp, a website with Cloudflare anti-bot protection.

The following tools are necessary to follow along with this tutorial.

Selenium WebDriver serves as a web automation tool, allowing you to manage web browsers. Previously, you needed to install WebDriver separately, but starting from Selenium version 4 and later, it comes bundled. If you’re using an older version, update to access the latest features and capabilities. Check your current version using pip show selenium and upgrade with pip install --upgrade selenium.

Open a terminal. In your desired directory, install Selenium.

pip install selenium 

In your Python file, copy and paste the code block below.

from selenium import webdriver 
from selenium.webdriver.chrome.options import Options 
import time 
 
options = Options() 
options.add_argument("--headless") # Headless mode

driver = webdriver.Chrome(options=options) 

driver.get("https://www.datacamp.com/users/sign_in") 
 
time.sleep(20) 
 
driver.save_screenshot("datacamp.png") 
 
driver.close()

Run the Python file.

DataCamp Blocked
Click to open the image in full screen

After running the script, the request came back with an error preventing access to the HTML elements, and we can’t crawl the webpage without these elements. Good one, Cloudflare, you win this one!

So how do we tweak Selenium to bypass Cloudflare? We’re getting there.

Frustrated that your web scrapers are blocked once and again?
ZenRows API handles rotating proxies and headless browsers for you.

Try for FREE

How to Bypass Cloudflare with Selenium

As we’ve discussed and shown, using base Selenium for Cloudflare just doesn’t work since it isn’t capable of accessing sites with complex anti-bot services. That said, let’s take a look at a few tweaks and tricks available to bypass Cloudflare Selenium.

Selenium Cloudflare Bypass with undetected_chromedriver

undetected_chromedriver is a selenium.webdriver.Chrome replacement and it’s often used when there’s a need to access a site with anti-bot protection as it focuses on stealth. With undetected_chromedriver, a web-driver can be created and used to bypass bot detections, like Cloudflare.

Let’s proceed to use undetected_chromedriver to access the DataCamp sign-in page. Start by installing it.

pip install undetected-chromedriver

Create a Python file and import undetected_chromedriver.

import undetected_chromedriver as uc

Instantiate undetected_chromedriver.

driver = uc.Chrome(...)

With our instantiated driver, let’s make a successful call to DataCamp using .get() from the webdriver. time.sleep is used as an explicit wait condition to keep our window open until the process is done and the maximize_window() method is used to maximize the window if it’s not already maximized.

import undetected_chromedriver as uc 
import time 
 
options = uc.ChromeOptions() 
options.headless = False  # Set headless to False to run in non-headless mode

driver = uc.Chrome(use_subprocess=True, options=options) 
driver.get("https://www.datacamp.com/users/sign_in") 
driver.maximize_window() 

time.sleep(20) 
driver.save_screenshot("datacamp.png") 
driver.close()

Run the created file using the Python command and the name of the file:

python scraper.py

And that’s it, here’s what you’ll see:

DataCamp Login Page Unblocked
Click to open the image in full screen

Congratulations! You have avoided getting Selenium blocked by Cloudflare, well for now.

Limitations of undetected_chromedriver

If you’re looking to scrape a website with basic anti-bot protection, then undetected_chromedriver might be enough for you. But when it comes to websites that use advanced Cloudflare protection and other DDoS mitigation services, undetected_chromedriver can be unreliable.

For example, we tried to access the Asana page on g2.com using undetected_chromedriver and the steps shared above. Do you want to know what happened? We got blocked.

G2 Blocked
Click to open the image in full screen

As you can see, undetected_chromedriver failed because the G2 anti-bot service detected that our browser session was automated. So how do we solve this problem? Easy: using ZenRows.

Selenium Cloudflare bypass using ZenRows

ZenRows is a web scraping tool capable of bypassing different types of antibots, even complex ones, with a simple API call. And yes, it can bypass Cloudflare without stress. Let’s see how.

Zenrows dashboard
Click to open the image in full screen

To get started, create a free ZenRows account and navigate to the Request Builder. We’ll be using Zenrows API, so click on Python and select API from the options on the screen. Paste the URL to scrape, enable Javascript rendering, and Antibot. ZenRows will automatically generate a Python web scraping script for you.

Copy the code generated and paste it into your Python file.

# pip install requests
import requests

url = 'https://www.g2.com/products/asana/reviews'
apikey = '<YOUR_ZENROWS_API_KEY>'
params = {
    'url': url,
    'apikey': apikey,
    'js_render': 'true',
    'antibot': 'true',
    'premium_proxy': 'true',
}
response = requests.get('https://api.zenrows.com/v1/', params=params)
print(response.text)

The final step is to run the script in the terminal.

python scraper.py

Boom! Just like that, we have our output:

Output
Click to open the image in full screen

C’est fini, you’ve successfully bypassed Cloudflare with ZenRows!

CloudFlare 5秒盾 破解! challenge by pass! 成功突破防火牆! 爬蟲、機器人

CloudFlare 5秒盾 破解! challenge by pass! 成功突破防火牆! 爬蟲、機器人

近期在撰寫爬蟲機器人,發現許多網站都裝上了CloudFlare的防火牆,其中5秒盾是最難攻克的一環。
5秒盾的工作原理是,一旦他覺得你可疑,就會把頁面跳到challenge.html,透過Javascript等待5秒,並且重新送出表單逼你按確定。
才可以重新進入網站。

我試過建立完整的HTTPHEADER以及user-agent依然沒用,還是會被跳轉到challenge.html。
用網路找來的透過第三方網站幫你計算Javascript的五秒盾解密也是失敗。
就算用python的webbrowser先開啟Firefox來破解五秒盾後再進網站有時還是會失敗。

至於PHP,原本想法是先用A.php去取得cloudflare的cookie後,再把這個數值換到B.php身上,再訪問網站,依然失敗。
Cloudflare不虧是世界大站,防火牆等級很高XD

但即使如此,我還是發現了可用的方法!

原理說明:
1.訪問目標網站時,若對方開啟cloudflarfe的網站,這時瀏覽器會取得一組「app_session」的cookie

2.cloudflare會針對這組cookie進行檢測,判斷是否有正常訪問和更新。
3.如果「app_session」未有資料,或是進行不正常訪問,頁面就轉到challenge.html去做驗證。

根據上述,會發現關鍵在於「app_session」有持續更新,所以我的作法如下,以php Curl為例:

1.先用Firefox開啟目標網站,取得完整的cookie值以及User-Agent資料
2.把取得的cookie值,套進curl裡面的「curl_setopt($ch, CURLOPT_COOKIE, $setcookie);」$setcookie這個參數。
3.把取得的User-agent資料,套進curl裡面的「curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);」$headers這個參數。

基本上php修改成這樣就可以了。接下來才是關鍵!

4.Firefox安裝套件 Tab Reloader (page auto refresh)
5.Firefox在目標網站啟動Tab Reloader (page auto refresh)這個擴充套件,並且做下圖設定。

Enable Reloader for this tab 及 Bypass form submission: 要啟用,秒數設定10秒。

如此一來,剛剛得到的「app_session」這組資料就會不斷地被更新,也就比較不容易被轉到challenge.html去做驗證。
Firefox跟php不需要同一個IP,換句話說,你可以透過A電腦開啟firefox取得app_session後,拿到B電腦去用。
只要A電腦的有持續更新app_session就可以了。

===2020/01/03補充====
最好是拿兩種瀏覽器如 Chrome及Firefox 同時進行重新整理動作。

上面這個方法我已經測試了24H*14天,目前一切都正常,未有被檔死的經驗。
有被擋過數次,但很快透過Firefox的autorefresh功能後就會通過驗證了。

以上,如果您有更好的方法,也歡迎在下方留言交流!

MySQL 複製資料到另一個資料表

MySQL 複製資料到另一個資料表

要把兩個資料表合併成一個很簡單。
INSERT INTO table1 (item1, item2, item3...) SELECT item1, item2, item3... FROM table2
這是把table2的東西塞到table1的狀況,後面也可以用WHERE去做一個資料篩選的動作。

or

CREATE TABLE new_table LIKE my_db.old_table;
然後複製
INSERT new_table SELECT * FROM my_db.old_table;

IRS即時反饋系統

IRS即時反饋系統

logo
何為IRS 即時反饋系統

IRS 即時反饋系統(Interactive Response System,簡稱 IRS)是近幾年來改善課堂教學品質最重要的資
訊應用設備之一。主要是讓課堂中的學生可以即時反饋資訊給老師的一種教學應用系統,也可以讓老師
在課堂教學活動中,隨時統計學生反饋的結果和比例,立即掌握全班學生的學習情況,並隨時調整授課
步調。

IRS即時反饋系統,是近幾年來改善課堂教學品質最重要的資訊應用設備之一,在歐、美
地區已經普遍應用這項科技於課堂教學活動中。例如在美國有超過 1000所大學(如哈佛大學、
布朗大學)導入 IRS系統,有更多的中小學導入這項科技。
為了發展可以讓學生可以即時反饋的教學輔具,早在1991年,美國哈佛大學物理系教授
Eric Mazur 便設計了Flashcard 讓學生可以立即反饋問題的選項,應用於同儕教學法(Peer
Instruction)中。
Eric Mazur 教授說:『我從講述式的教學轉換到問答式教學,利用 Flashcard

表決,是幫助我能夠立即清楚學生學到什麼,或者思考學生學到什麼。』
Mazur 教授又說:『我意外地了解到很多學生並不懂我跟他們講的東西,
我立刻知道我必須花更多時間來解釋教材,以前我將會繼續後面的教學主題,因而
增加了學習進度落後的學生數目。』

如何讓 IRS 教學活動效益更好

*IRS活動強調增強教學互動與批判性思考,而非只在維持學生注意力和即席評量。
*同儕討論與合作學習也是學習的重要組成元件之一,留一些時間讓同學互相討論,學習效益會
更好。
*對於內容的討論是精華而小規模的,建議值是 5~10%,太高的比例會使學生焦慮,轉而專注在
是否答對問題。
*問題應在中等難度,太難或太簡單都是沒有用。
*經常且規律的使用這項科技。
*問題應著重在測驗學生對於概念的理解

即時反饋系統包含硬體和軟體兩部份:其中硬體部份主要包含一組遙控器和一個接收器,它必須搭
配教室中既有的班級電腦與巨型顯示器(單槍投影或電視)。軟體部份則可提供教師事先編製選擇題,並
透過巨型顯示器展示問題,引導學生按下手持式遙控器之按鈕選擇答案,系統可同時蒐集所有學生的答
案,並以視覺化圖表或同時展示所有答案的方式呈現作答結果 。教師可進一步利用作答結果的呈現,引
導學生進行答案理由之說明與深入討論,藉此促進課堂學生的互動與溝通。

以上資料來自 http://cdtl.nchu.edu.tw/it/data/irs_teach.pdf

優秀程式設計師必備的一些素質

優秀程式設計師必備的一些素質

網上看到的文章,分享一下~~

作爲一個合格而優秀的程式設計師,應該具有哪些素質?其實才工作半年的我,好像遠遠不够資格來談論這個話題,不過這半年的成長讓我獲益匪淺,在程式設計師這個話題上也可以多多少少說出一點有價值的東西來。
一、對開發工作要有必要的興趣
興趣是最好的老師,對某個事物有了一定的興趣,才會潜下心來學習、研究它,工作同樣如此。如果對程式設計師的工作完全沒有興趣,甚至是抱著厭惡的態度,那麽其工作結果和能力就可想而知了。在這裏說興趣,幷不要求你達到對編程有著狂熱的愛好這種程度,只需要你還算喜歡這份工作即可,哪怕抱著平常心來面對也好。
二、要善于學習和總結
都說程式設計師是一個吃青春飯的職業,雖然這話說的略顯絕對,但也有一定的道理。IT領域的技術更新換代太快了,一門新的語言興起幷不需要太久的時間,只有不斷的接觸幷學習新東西,才能不被淘汰掉。所謂“活到老,學到老”,這話用在程式設計師身上可能是最適合不過的了。
而在學習的同時,也要善于進行總結。每次完成了一項工作,都對這次的工作進行一下總結,比如用了什麽技術、如何進行的項目設計、如何考慮的用戶體驗等,而在工作中出現的問題也應該牢牢記住,從自己的不足中吸取教訓,這樣才能使自己成長起來。
三、要養成良好的習慣
首先,要有寫文檔的習慣,不要覺得程式設計師的工作只是寫程式碼,這樣的程式設計師一輩子也就是個“碼農”了,絕對沒有前途的。在正規的軟件公司中,文檔的地位很高,開發流程裏面通常也體現出了各個環節的文檔的位置。沒有文檔的軟件是很難長久的存活下去的,因爲在測試、複用、升級等方面都會遇到越來越大的阻力。越是高級的程式設計師,就越應該重視文檔。
其次,要養成良好的編碼習慣。變量如何命名?函數(方法)如何命名?程序中的注釋怎麽寫?程序的縮進格式怎樣確定?好一點的公司都會有這方面的文檔,但是總有程式設計師從來都不看這些文檔,他們認爲最牛的程式設計師寫出來的程序應該除了自己沒有人能看懂,然後他們真的就這樣做了——結果就是別人看不懂,沒法合作,到最後連他們自己都看不懂,這種人連作爲一個程式設計師的基本素質都不具備。寫出規範化、標準化的程序程式碼,是一個合格程式設計師最基本的素質。
最後要提一下的是測試習慣。雖然正規的軟件公司都有專門的測試部門,但是開發部門也不能就此降低自我要求。軟件所含問題發現的越早,付出的成本就越低,如果開發人員在開發早期就能發現一些問題幷解决,就可以節省大量的人力和物力。同時,程式設計師應該對自己開發的程序進行功能性測試,你總要保證自己開發的軟件能正常使用吧?如果連這點都做不到,那你這程序寫的就沒用了。而且要盡可能的模擬用戶實際使用的一些狀况,要想到一些特殊的异常狀况。雖然在實際工作中開發人員很難做到全方位的測試,但一定要清楚這項工作的重要性。
四、要能正確理解用戶需求
現在什麽都講究個用戶體驗,而這對軟件來說簡直就是賴以生存的根本。一個軟件的用戶體驗如何,在極大的程度上能决定這款軟件能否成功。通常在開發工作開始前,項目組會對該項目的用戶需求進行分析和討論,正確的理解了用戶需求,再劃分合理的模塊,甚至考慮到一些潜在的威脅,這都是一個優秀的程式設計師所具有的素質。做到這一點很不容易,像我這樣的程式設計師,目前只能停留在口頭上,實際工作中我想的都非常不全面。
五、要注重程序的複用性和模塊化
是不是一直覺得做程式設計師太累了?是的,程式設計師這份工作確實壓力比較大,但是有些程式設計師的工作壓力相當一部分是自己給自己添加的,他們總是在做一些重複的工作,而從來不會考慮複用性和模塊化的思想。程式設計師在完成某個功能模塊的時候,不應該把思維局限在這次工作中,而是應該想想,能否把這部分程式碼脫離出本次工作,能否將其設計成其他系統也能調用的功能模塊?如果每個人都能有這樣的思維,日積月累下來,大家的重複性工作就會大大减少,也就有更多的精力來進行新功能的開發與創新。
六、擁有團隊協作的精神
雖然我把這一點放在最後,但是它的重要性我想不需要太强調了吧。現在的軟件功能通常很複雜,而且還要涉及到良好的UI(用戶界面),甚至要考慮到整個系統的協調,一個人是根本不可能完成這種工作的,所以團隊協作是必要也是必須的。在一個項目團隊中,如何根據每個人所擅長的領域來分配工作,如何協調人力資源等,都是非常重要的。而在工作中遇到了問題,團隊應該立刻想辦法互相幫助來解决。
關于程式設計師必備的專業素質,暫時我就只想到這麽多。雖然只有六點,但是能做到的那就真的是很優秀的程式設計師了,相信這樣的幷不多見。這些素質的養成需要一個時間,想要一蹴而就是不現實的,而是應該在日常工作中先培養起自己的意識,然後逐漸的養成這些素質。祝每個程式設計師,都能擺脫“碼農”的狀態,成爲一個優秀的程式設計師。