File size: 5,471 Bytes
b2974e8
7119782
 
7e21d9b
7119782
322ddc5
7e21d9b
7a83db7
7e21d9b
 
 
 
 
 
d743cd0
7e21d9b
 
 
 
 
322ddc5
7e21d9b
7119782
7e21d9b
 
91667e3
7e21d9b
bbf602c
 
47e2fc4
 
53590af
 
bbf602c
f5ed2ae
 
b95b7b7
 
 
 
 
 
9deb76c
 
 
 
 
 
e61feaf
b95b7b7
e61feaf
 
 
b95b7b7
9deb76c
b95b7b7
e5bd9f1
9deb76c
47e2fc4
7119782
b95b7b7
 
47e2fc4
 
53590af
 
f5ed2ae
53590af
7119782
 
7a83db7
7119782
7a83db7
ba3ff9a
8a68160
9721517
4fccbbb
84eae57
 
 
7119782
8a68160
1b06ef3
188966c
081ca32
 
9721517
 
8a68160
9721517
8a68160
7119782
b7d9073
 
ba3ff9a
7119782
b7d9073
 
ba3ff9a
322ddc5
 
 
 
35ef342
 
 
 
 
 
 
f829878
b7d9073
 
e1fee45
b7d9073
e1fee45
ba3ff9a
c80fdf5
 
 
 
 
e1fee45
c80fdf5
b7d9073
 
 
7119782
c80fdf5
 
 
 
 
7119782
 
 
 
 
f5ed2ae
bc5df64
37cf3dc
 
7119782
adc823d
 
71194e2
e5bd9f1
322ddc5
47e2fc4
53590af
 
 
 
 
 
 
f5ed2ae
188966c
3dbc3bb
7119782
 
f829878
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
import streamlit as st
import pandas as pd
import requests
import base64

def get_backlinks(api_login, api_key, target_url, filters):
    # Encoding credentials
    encoded_credentials = base64.b64encode(f"{api_login}:{api_key}".encode()).decode()

    # Setting headers with Basic Authentication
    headers = {
        'Authorization': f'Basic {encoded_credentials}'
    }

    # Prepare post data
    post_data = {
        0: {
            "target": target_url,
            "limit": 1000,
            "mode": "as_is",
            "filters": filters
        }
    }

    # Making the API request
    response = requests.post("https://api.dataforseo.com/v3/backlinks/backlinks/live", json=post_data, headers=headers)

    response_json = response.json()

    # Log the full response for debugging
    st.text("API Response:")
    st.text(f"Response Status Code: {response.status_code}")
    st.text(f"Response Headers: {response.headers}")
    st.text(f"Response Body: {response_json}")  # Now response_json is defined

    # Check if the response contains 'results' key and handle the JSON structure appropriately
    if response.status_code == 200:
        response_data = response.json()
        
        # Debugging: Print out the keys of the response_data
        st.text(f"Keys in response JSON: {list(response_data.keys())}")

        if 'tasks' in response_data:
            # Assuming there is only one task and one result within each task
            task_result = response_data['tasks'][0]['result']
            if task_result and 'items' in task_result[0]:
                # The actual backlink items are nested within 'items'
                items = task_result[0]['items']
                st.text(f"First few items: {items[:5]}")  # Debugging line to show the items structure
                
                # Convert to DataFrame
                df = pd.json_normalize(items)
                return df
            else:
                st.error("Received empty 'result' from API or missing 'items'.")
                return None
        else:
            st.error(f"No 'tasks' key in response JSON. Full response: {response_data}")
            return None
    else:
        error_message = response.json().get('status_message', 'No specific error message provided')
        st.error(f"Error: Code: {response.status_code} Message: {error_message}")
        return None

def convert_df_to_csv(df):
    # Convert DataFrame to CSV
    return df.to_csv(index=False).encode('utf-8')

# Streamlit layout
st.sidebar.title("DataForSEO API Parameters")
api_login = st.sidebar.text_input("API Login", value="[email protected]")
api_key = st.sidebar.text_input("API Key", type="password")

# Filters input
st.sidebar.title("Filters")
url_from_not_contain = st.sidebar.text_input("URL from does not contain (comma-separated)")
backlink_spam_score = st.sidebar.number_input("Backlink Spam Score ≤", value=20)
page_from_rank_value = st.sidebar.number_input("Page From Rank Value ≥", value=0)
domain_from_rank_value = st.sidebar.number_input("Domain From Rank Value ≥", value=0)
page_from_language = st.sidebar.selectbox("Page From Language", ['en', 'other'])
is_lost = st.sidebar.checkbox("Is Lost", value=False)
dofollow = st.sidebar.checkbox("Dofollow", value=False)
is_broken = st.sidebar.checkbox("Is Broken", value=False)

filters = []

if url_from_not_contain:
    for url in url_from_not_contain.split(','):
        filters.append(["url_from", "not_like", f"%{url.strip()}%"])
        filters.append("and")
        
if is_lost:
    filters.append(["is_lost", "=", is_lost])
    filters.append("and")

if dofollow:
    filters.append(["dofollow", "=", dofollow])
    filters.append("and")

if is_broken:
    filters.append(["is_broken", "=", is_broken])
    filters.append("and")

if page_from_rank_value != 0:
    filters.append(["page_from_rank", ">=", page_from_rank_value])
    filters.append("and")

if domain_from_rank_value != 0:
    filters.append(["domain_from_rank", ">=", domain_from_rank_value])
    filters.append("and")

filters.append(["backlink_spam_score", "<=", backlink_spam_score])
filters.append("and")

filters.append(["page_from_language", "=", page_from_language])
filters.append("and")

filters.append(["anchor", "not_like", ""])  # Assuming empty string represents empty anchor
filters.append("and")

# Filter for domain from rank being greater than or equal to 100
filters.append(["domain_from_rank", ">=", 100])
filters.append("and")

# Remove the last "and" if it's the last element
if filters and filters[-1] == "and":
    filters.pop()

# Output the entire filters section
st.text("Current filters:")
for f in filters:
    st.text(f)

# Main app layout
col1, col2 = st.columns(2)

with col1:
    st.header("Input")
    target_url = st.text_input("Enter the target URL")

generate_button = st.sidebar.button("Generate All")
reset_button = st.sidebar.button("Reset")

df = None

# Generate CSV and download button
if generate_button and target_url:
    df = get_backlinks(api_login, api_key, target_url, filters)
    if df is not None:
        csv = convert_df_to_csv(df)
        st.download_button(
            label="Download data as CSV",
            data=csv,
            file_name='backlinks.csv',
            mime='text/csv',
        )
    else:
        st.error("Failed to generate CSV: No data returned from the API or data processing error.")

# Reset functionality
if reset_button:
    st.experimental_rerun()