Skip to content

Commit 7f7d4d1

Browse files
committed
feat: add Bing as a search provider
1 parent 21e5823 commit 7f7d4d1

2 files changed

Lines changed: 38 additions & 1 deletion

File tree

mini_copilot/commands/search_provider.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
SEARCH_PROVIDERS = ["duckduckgo", "startpage"]
1+
SEARCH_PROVIDERS = ["duckduckgo", "startpage", "bing"]
22

33

44
def handle_search_provider_command(search_provider):

mini_copilot/web_search.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,41 @@ def search_startpage(query, num_results=20):
8787
return results[:num_results]
8888

8989

90+
def search_bing(query, num_results=20):
91+
"""Using Bing's search which is a good alternative"""
92+
# Use international URL and parameters to bypass country redirection
93+
url = f"https://www.bing.com/search?q={query}&setmkt=en-US&setlang=en-US&cc=US"
94+
95+
try:
96+
# Use a session to maintain cookies
97+
session = requests.Session()
98+
# Set cookies to force US market and English language
99+
session.cookies.set("SRCHHPGUSR", "SRCHLANG=EN&WLS=2", domain=".bing.com")
100+
session.cookies.set("_EDGE_S", "mkt=en-us", domain=".bing.com")
101+
102+
res = session.get(url, headers=HEADERS, proxies=PROXY, timeout=10)
103+
res.raise_for_status()
104+
except Exception as e:
105+
print(f"[web search] Error searching Bing: {e}")
106+
return []
107+
108+
soup = BeautifulSoup(res.text, "html.parser")
109+
results = []
110+
111+
for item in soup.select("li.b_algo"):
112+
title_link = item.select_one("h2 a")
113+
if not title_link:
114+
continue
115+
116+
href = title_link["href"]
117+
if href.startswith("//"):
118+
href = "https:" + href
119+
120+
results.append({"title": title_link.text.strip(), "url": href})
121+
122+
return results[:num_results]
123+
124+
90125
def extract_text_from_url(url):
91126
try:
92127
session = requests.Session()
@@ -173,6 +208,8 @@ def web_search(query, num_results=5, provider="duckduckgo"):
173208

174209
if provider == "startpage":
175210
search_results = search_startpage(query, num_results=num_results)
211+
elif provider == "bing":
212+
search_results = search_bing(query, num_results=num_results)
176213
else:
177214
search_results = search_ddg(query, num_results=num_results)
178215

0 commit comments

Comments
 (0)