Ngiêm cấm sử đụng PROXY và VPS vào mục đích trái pháp luật bạn sẽ phải chịu toàn bộ trách nhiệm trước pháp luật khi sử dụng dịch vụ của chúng tôi tks!
Jira API bằng Python: đọc issue theo JQL, phân trang và ADF

Jira API bằng Python: đọc issue theo JQL, phân trang và ADF

Chuyên viên Kỹ thuật ProxyVN 01-16-2026 Đang tính... phút đọc

Jira API bằng Python là cách lấy danh sách issue theo truy vấn JQL, chọn đúng trường cần dùng và xuất báo cáo mà không phải mở từng ticket. Với Jira Cloud, điểm cuối tìm kiếm hiện hành là /rest/api/3/search/jql, phân trang bằng nextPageToken, còn mô tả issue trả về dạng Atlassian Document Format. ProxyVN đã gọi thật Jira Cloud không kèm khóa và một Jira Data Center công khai ngày 29/10/2026, rồi dựng server giả lập theo đặc tả chính thức để chạy phần cần token.

Jira API bằng Python: mục tiêu dữ liệu, quyền và phạm vi truy cập

Trước khi viết code, anh em cần chốt project nào, loại issue nào, trường nào và khoảng thời gian nào. Một project Jira lâu năm có hàng chục nghìn issue, mỗi issue có hàng trăm trường, nên truy vấn không giới hạn sẽ nặng và chậm.

Báo cáo issue dùng để làm gì

Nhu cầu hay gặp là báo cáo tuần: bao nhiêu issue mới, bao nhiêu đã xong, issue nào tồn lâu nhất. Nhu cầu khác là xuất danh sách lỗi kèm mô tả để đưa vào công cụ phân tích hay kho tìm kiếm nội bộ. Cả hai chỉ cần đọc.

Bài này không tạo, sửa, chuyển trạng thái hay bình luận vào issue nào. Script đọc lỗi thì thiếu dữ liệu, script ghi lỗi có thể đổi trạng thái hàng trăm ticket của nhóm khác.

Jira Cloud và Jira Data Center

Jira Cloud chạy trên tencongty.atlassian.net và dùng REST API phiên bản 3, mô tả issue ở dạng ADF. Jira Data Center do công ty tự cài, thường dùng REST API phiên bản 2, mô tả issue là chuỗi văn bản kiểu wiki. Hai loại có điểm cuối tìm kiếm và cách phân trang khác nhau.

Lab gọi serverInfo của hai máy chủ. Site Jira Cloud trả version 1001.0.0-SNAPSHOT. Máy chủ jira.atlassian.com, nơi Atlassian nhận yêu cầu tính năng công khai, trả version 10.3.26 và deploymentType là Server. Bài tập trung vào Jira Cloud, dùng máy chủ công khai này để có dữ liệu thật đối chiếu.

Quyền đi theo tài khoản

Jira chỉ trả issue mà tài khoản gọi API được phép xem. Project có quyền riêng, issue có mức bảo mật riêng. Token API của một người mang đúng quyền của người đó, không hơn.

Với script chạy định kỳ, nên dùng tài khoản dịch vụ chỉ có quyền Browse ở đúng những project cần báo cáo. Đặc tả OpenAPI ghi điểm cuối tìm kiếm chấp nhận OAuth với phạm vi read:jira-work, phạm vi này chỉ cho đọc.

Không sửa issue

Chỉ dùng phương thức GET cho tìm kiếm và đọc issue. Điểm cuối tìm kiếm có cả bản POST, nhưng POST ở đây vẫn là đọc, chỉ để gửi JQL dài. Các điểm cuối PUT, DELETE và điểm cuối transitions mới là ghi.

Khi viết hàm gọi API chung, nên chặn mọi phương thức khác GET và POST tìm kiếm ngay trong code. Một dòng kiểm tra rẻ hơn nhiều so với khôi phục trạng thái issue bị đổi nhầm.

Ranh giới với bài Jenkins proxy

Bài Jenkins proxy nhắc Jira như một dịch vụ mà plugin Jenkins có thể gọi ra ngoài qua proxy. Bài này không cấu hình Jenkins. Bài này viết script Python đọc issue và dựng báo cáo, chạy ở bất kỳ đâu có Python.

Bài cũng khác bài Confluence. Confluence trả trang với body storage hoặc ADF, phân trang cursor qua _links.next. Jira trả issue với trường tùy biến, phân trang qua nextPageToken trong thân phản hồi. Quyền của hai dịch vụ cấp riêng.

Đầu ra của bài này

Bài hướng tới một báo cáo issue với các trường chọn lọc: key, id, summary, status, nhóm trạng thái, created, priority, story points và mô tả đã chuyển sang text. Báo cáo không chứa tên hay account ID của người được giao, người báo lỗi hay người được nhắc tới trong mô tả.

Jira API bằng Python: đọc issue theo truy vấn được phép, chuẩn hóa pagination và Atlassian Document Format

Phần này giải thích điểm cuối tìm kiếm mới, cách chọn trường và cấu trúc ADF.

Điểm cuối tìm kiếm hiện hành

410 và search/jql

410 và search/jql

Lab gọi điểm cuối cũ /rest/api/3/search trên Jira Cloud. Kết quả là mã 410, thân báo API đã bị gỡ và yêu cầu chuyển sang /rest/api/3/search/jql. Nhiều ví dụ trên mạng và thư viện cũ vẫn dùng điểm cuối cũ, nên code copy về sẽ hỏng ngay.

Trang nhóm Issue search của Jira Cloud mô tả điểm cuối mới. Đặc tả ghi phản hồi gồm issues, isLast, nextPageToken, names, schema và warnings.

Thấy mã 410 khi gọi /rest/api/3/search là dấu hiệu code đang dùng điểm cuối đã gỡ, không phải lỗi quyền.

Truy vấn phải có giới hạn

Đặc tả ghi tham số jql yêu cầu truy vấn có điều kiện giới hạn. Lab gửi jql chỉ có "order by key desc" lên Jira Cloud. Máy chủ trả 400 với thông báo truy vấn không giới hạn không được phép, yêu cầu thêm điều kiện tìm kiếm.

Truy vấn có giới hạn là truy vấn có ít nhất một điều kiện như project = ABC hoặc updated >= -7d. Với báo cáo, điều kiện project và khoảng thời gian là đủ.

Chọn trường bằng tham số fields

Đặc tả ghi mặc định của fields là id. Nghĩa là gọi tìm kiếm mà không chỉ định fields chỉ nhận về id issue. Server giả lập làm theo mô tả này: issue đầu tiên chỉ có trường id là 10001.

Phải liệt kê trường cần dùng, ví dụ summary,status,created,priority,description. Có thể dùng *all để lấy tất cả, nhưng phản hồi sẽ rất nặng. Đặc tả ghi số issue mỗi trang có thể ít hơn maxResults khi xin nhiều trường.

ADF là cây JSON

Atlassian Document Format là cây JSON với nút gốc type doc. Bên trong là các nút paragraph, heading, codeBlock, bulletList, listItem, text, mention và nhiều loại khác. Trang cấu trúc ADF liệt kê đủ các loại nút.

Khác Confluence, trong phản hồi tìm kiếm Jira, trường description là đối tượng JSON trực tiếp, không phải chuỗi JSON lồng trong chuỗi. Server giả lập trả đúng như vậy. Code xử lý không cần json.loads thêm lần nữa.

Hàm chuyển ADF sang text

ADF sang text

ADF sang text

Hàm của lab duyệt cây đệ quy: nút text trả chữ, nút mention trả [nguoi dung], listItem thêm gạch đầu dòng, codeBlock bọc bằng ba dấu backtick, paragraph thêm xuống dòng.

def adf_text(n):
    t = n.get("type")
    if t == "text": return n["text"]
    if t == "mention": return "[nguoi dung]"
    s = "".join(adf_text(c) for c in n.get("content", []))
    if t == "listItem": return "- " + s
    if t == "codeBlock": return "```\n" + s + "\n```\n"
    return s + ("\n" if t == "paragraph" else "")

Với mô tả mẫu của server giả lập, kết quả là một dòng mô tả lỗi 407, một khối mã, và hai gạch đầu dòng, trong đó tên người được nhắc đã thay bằng [nguoi dung].

Khi nào dùng bản POST của tìm kiếm

JQL dài, ví dụ danh sách vài trăm key issue, có thể vượt độ dài URL cho phép. Đặc tả ghi khi đó dùng bản POST của /search/jql, gửi jql, fields và nextPageToken trong thân JSON. Đây vẫn là thao tác đọc, không thay đổi issue nào.

Lab chỉ chạy bản GET. Với báo cáo theo project và khoảng thời gian, JQL thường ngắn và bản GET đủ dùng. Nếu chuyển sang POST, giữ nguyên logic phân trang và retry như bản GET.

Mô tả ở Jira Data Center là chuỗi

Lab lấy issue thật JRACLOUD-99860 từ jira.atlassian.com qua API phiên bản 2. Trường description có kiểu str, bắt đầu bằng "*Description:*" và các dấu xuống dòng \r\n. Đây là cú pháp wiki của Jira, không phải ADF.

Một script đọc cả Cloud lẫn Data Center phải kiểm tra kiểu của description trước khi xử lý. Đối tượng dict là ADF, chuỗi là wiki markup.

Chuẩn bị truy vấn JQL, issue key, token và phiên bản cho Jira API bằng Python

Phần này đi qua cách viết JQL, cách gửi token và các mã lỗi thật khi thiếu quyền.

Viết JQL cho báo cáo

JQL cho báo cáo tuần có dạng project = ABC AND updated >= -7d ORDER BY updated DESC. Điều kiện project giới hạn phạm vi, điều kiện thời gian giới hạn số issue, ORDER BY giữ thứ tự ổn định giữa các lần chạy.

Đặc tả ghi phần ORDER BY tối đa 7 trường. Với báo cáo, một hoặc hai trường là đủ. Thứ tự ổn định giúp so sánh hai lần chạy dễ hơn.

Lỗi cú pháp JQL

Lab gửi "projectt = = ABC" lên Jira Cloud. Máy chủ trả 400, thông báo lỗi JQL chỉ rõ vị trí ký tự 12 và yêu cầu đặt dấu bằng trong ngoặc kép nếu muốn dùng làm giá trị. Jira Data Center trả đúng thông báo đó.

Lỗi 400 từ JQL không nên retry. Đọc errorMessages, sửa truy vấn rồi chạy lại. Bài lỗi 400 Bad Request có thêm cách đọc lỗi phía client.

Project không tồn tại hoặc không có quyền

Trên Jira Data Center công khai, lab gửi project = KHONGCO123. Máy chủ trả 400 với thông báo giá trị KHONGCO123 không tồn tại cho trường project. Thông báo này xuất hiện cả khi project tồn tại mà người gọi không có quyền xem.

Trên Jira Cloud, lab gọi issue ABC-1 không token. Máy chủ trả 404 với thông báo issue không tồn tại hoặc anh em không có quyền xem. Jira cố ý không phân biệt hai trường hợp.

Tìm kiếm không token trả 200 rỗng

200 nhưng rỗng

200 nhưng rỗng

Đây là chỗ nguy hiểm nhất. Lab gọi /rest/api/3/search/jql với jql project = ABC trên Jira Cloud mà không có token. Máy chủ trả 200 với thân issues là mảng rỗng và isLast là true. Không có lỗi nào.

Đặc tả ghi điểm cuối này có thể gọi ẩn danh, và người gọi ẩn danh chỉ thấy những gì người ẩn danh được thấy. Nếu token hết hạn hay biến môi trường chưa nạp, script sẽ chạy thành công và báo không có issue nào.

Kết quả tìm kiếm rỗng phải được kiểm tra bằng một request xác thực riêng trước khi tin.

Kiểm tra token bằng /myself

Cách kiểm tra rẻ nhất là gọi /rest/api/3/myself trước khi tìm kiếm. Lab gọi không token, nhận 401 với nội dung yêu cầu xác thực và header www-authenticate. Gửi Basic auth với email và token giả cũng nhận 401, kèm header x-seraph-loginreason là AUTHENTICATED_FAILED.

import os, requests
S = requests.Session(); S.auth = (os.environ["JIRA_EMAIL"], os.environ["JIRA_TOKEN"])
me = S.get(f"{SITE}/rest/api/3/myself", timeout=30)
if me.status_code != 200: raise SystemExit("Token khong hop le, dung truoc khi tim kiem")

Đoạn mã trên chưa chạy với token thật. Nếu /myself trả 200 mà tìm kiếm vẫn rỗng, khi đó mới kết luận tài khoản không có issue nào khớp.

Phiên bản API

Jira Cloud dùng /rest/api/3. Jira Data Center dùng /rest/api/2, lab gọi thành công trên jira.atlassian.com. Trang giới thiệu REST API v3 của Jira Cloud ghi khác biệt chính giữa v2 và v3 là hỗ trợ ADF.

Ghi rõ phiên bản API và loại máy chủ vào cấu hình script. Khi công ty chuyển từ Data Center lên Cloud, đây là chỗ đầu tiên phải sửa.

Thu dữ liệu Jira API bằng Python có phân trang theo đúng nguồn

Jira Cloud và Jira Data Center phân trang theo hai cách khác nhau. Phần này đưa cả hai, một chạy thật và một chạy giả lập.

Phân trang offset ở Data Center

Lab tìm issue của project JRACLOUD tạo từ ngày 1/10/2026 trên jira.atlassian.com, mỗi trang 50 issue. Phản hồi có startAt, maxResults, total và issues. Total là 281.

Lab đi qua 4 trang, mỗi trang 50 issue, startAt lần lượt 0, 50, 100, 150. Thời gian là 0,794 giây, 0,264 giây, 0,540 giây và 0,274 giây. Trong 200 key thu được không có key trùng.

maxResults ở Data Center

Lab gửi maxResults 500 với fields chỉ có key. Máy chủ trả maxResults 500 và 281 issue, tức toàn bộ kết quả trong một trang. Máy chủ này chấp nhận trang 500 issue khi chỉ xin trường nhẹ.

Giới hạn trang phụ thuộc cấu hình từng máy chủ Data Center. Không nên giả định con số này đúng cho máy chủ của công ty mình. Đọc maxResults trong phản hồi để biết máy chủ thật sự trả bao nhiêu.

nextPageToken ở Jira Cloud

Theo đặc tả, Jira Cloud không còn startAt và total ở điểm cuối mới. Trang đầu gửi không có nextPageToken. Phản hồi có nextPageToken nếu còn trang sau. Trang cuối không có nextPageToken và isLast là true.

Lab không có token Jira Cloud, nên vòng lặp chạy trên server giả lập ở cổng 9730 với 11 issue, mỗi trang 4 issue.

tok = None; out = []
while True:
    p = {"jql": jql, "maxResults": 4, "fields": ",".join(fields)}
    if tok: p["nextPageToken"] = tok
    r = S.get(f"{B}/rest/api/3/search/jql", params=p, timeout=10)
    if r.status_code == 429: time.sleep(float(r.headers.get("Retry-After", "5"))); continue
    d = r.json(); out += d["issues"]; tok = d.get("nextPageToken")
    if d.get("isLast") or not tok: break

Kết quả: 11 issue sau 4 lần gọi, trong đó 1 lần nhận 429 và thử lại. Server giả lập trả 429 kèm Retry-After 1 ở request thứ hai để kiểm tra nhánh retry.

Không có total ở Jira Cloud

Mất total nghĩa là không biết trước có bao nhiêu trang. Thanh tiến trình phải dựa vào số issue đã đọc, không dựa vào phần trăm. Đặc tả có điểm cuối riêng /search/approximate-count để ước lượng số issue, lab chưa thử.

Không tự giải mã hay tự tạo nextPageToken. Token là chuỗi mờ, server giả lập dùng base64 của số thứ tự nhưng Jira thật có thể khác.

Giới hạn request

Trang giới hạn request của Jira Cloud mô tả việc trả 429 kèm Retry-After khi vượt giới hạn. Lab không chạm giới hạn thật. Hàm retry đọc Retry-After và chờ đúng số giây đó.

Bài rate limit API khi dùng proxy giải thích vì sao xoay IP không giải quyết giới hạn theo tài khoản. Jira tính giới hạn cho request có xác thực, nên đổi IP mà giữ token thì vẫn là cùng một người gọi.

Đối soát ID, kiểu dữ liệu, giá trị thiếu và xuất xứ trong Jira API bằng Python

Thu dữ liệu xong, phần này chuẩn hóa từng trường, xử lý giá trị null và loại thông tin người dùng.

key và id

Mỗi issue có key như LAB-1 và id như 10001. Key đổi khi issue chuyển project, id thì không. Báo cáo nên dùng id làm khóa nội bộ và hiển thị key cho người đọc.

Issue JRACLOUD-99860 lab lấy từ Data Center có id 2165703. Cả hai đều là chuỗi trong JSON. Lưu dạng chuỗi để tránh lỗi kiểu dữ liệu khi ghép bảng.

Trạng thái và nhóm trạng thái

Tên trạng thái do từng công ty đặt, ví dụ issue JRACLOUD-99860 có trạng thái Gathering Interest. Nhóm trạng thái statusCategory chỉ có ba giá trị chuẩn: new, indeterminate và done. Issue đó thuộc nhóm new.

Báo cáo so sánh giữa các project nên dùng nhóm trạng thái. Đếm theo tên trạng thái sẽ lệch khi hai project đặt tên khác nhau cho cùng một bước.

Giá trị null có ý nghĩa

Trong 11 issue giả lập, 5 issue có description null, 2 issue có priority null và 2 issue có story points null. Null nghĩa là trường chưa được điền, không phải bằng 0 hay rỗng.

Issue JRACLOUD-99860 có resolution null và assignee null. Resolution null là issue chưa được giải quyết. Báo cáo đếm issue đã xong nên lọc theo resolution khác null hoặc theo nhóm trạng thái done, không dựa vào một trường duy nhất khi chưa kiểm tra quy trình của project.

Trường tùy biến

Story points thường là trường tùy biến, tên dạng customfield_10016. Số sau customfield khác nhau giữa các site. Lab dùng customfield_10016 trong server giả lập làm ví dụ, site thật cần tra bằng điểm cuối danh sách trường.

Lưu bảng ánh xạ từ tên trường tùy biến sang tên dễ đọc trong cấu hình script. Khi quản trị viên đổi cấu hình trường, chỉ cần sửa bảng này.

Thời gian và múi giờ

Issue Data Center có created là 2026-10-16T14:22:21.000+0000, tức giờ UTC. Server giả lập trả created với hậu tố +0700. Định dạng thời gian của Jira có độ lệch múi giờ kèm theo, cần đọc đúng thay vì cắt chuỗi.

Lưu thời gian gốc, đổi sang múi giờ Việt Nam ở bước trình bày. Gom báo cáo theo ngày phải dùng cùng một múi giờ cho mọi issue.

Không lưu thông tin người dùng

Lab gọi issue thật với fields reporter, assignee và comment. Trường reporter có các khóa active, avatarUrls, displayName, key, name, self và timeZone. Đây là thông tin người dùng, kể cả múi giờ của họ.

Báo cáo của lab không lấy các trường reporter, assignee, và thay nhắc tên trong mô tả bằng [nguoi dung]. Nếu cần đếm issue theo người, thống nhất với nhóm trước và chỉ giữ mã nội bộ cần thiết.

Báo cáo issue không cần tên người báo lỗi để trả lời câu hỏi bao nhiêu issue đã xong.

Gom báo cáo theo tuần

Sau khi chuẩn hóa, báo cáo tuần chỉ còn vài phép đếm: số issue tạo trong tuần, số issue chuyển sang nhóm done, số issue còn mở quá 30 ngày. Mỗi phép đếm dựa trên created, nhóm trạng thái và ngày cập nhật đã đổi múi giờ.

Với dữ liệu thật từ jira.atlassian.com, 281 issue của JRACLOUD được tạo từ đầu tháng 10/2026 tới lúc lab chạy. Lab không phân tích nội dung các issue này, chỉ dùng để kiểm tra phân trang và cấu trúc trường. Con số sẽ tăng mỗi ngày.

Xuất xứ từng dòng

Mỗi dòng báo cáo giữ key, id, JQL đã dùng, thời điểm chạy và URL issue. Bài JSON và CSV khi crawl dữ liệu gợi ý lưu JSON gốc bên cạnh bảng tổng hợp để kiểm tra lại.

Lưu kết quả, giới hạn request và khi nào Jira API bằng Python thực sự cần proxy

Phần cuối nói về lưu trữ, tải tăng dần và vai trò thật của proxy.

Tải tăng dần theo updated

Lần chạy đầu lấy toàn bộ issue trong phạm vi. Các lần sau chỉ lấy issue có updated sau lần chạy trước, ví dụ updated >= "2026-10-28 00:00". Ghi đè dòng cũ theo id thay vì nối thêm.

Đặc tả ghi kết quả tìm kiếm có thể chưa phản ánh ngay thay đổi vừa xảy ra, và có tham số reconcileIssues để tăng tính nhất quán. Lấy chồng lấn vài phút giữa hai lần chạy giúp không bỏ sót issue vừa cập nhật.

Lưu theo lần chạy

Mỗi lần chạy lưu JSON gốc từng trang, file báo cáo CSV và file nhật ký gồm JQL, số issue, số trang, số lần 429. Khi báo cáo tuần có con số lạ, nhật ký giúp biết lần chạy đó có bình thường không.

Kiểm tra quyền định kỳ

Quyền của tài khoản dịch vụ có thể bị thay đổi khi quản trị viên dọn dẹp cấu hình. Script nên gọi /myself ở đầu mỗi lần chạy và so số issue với lần trước. Số issue giảm mạnh mà không có lý do rõ ràng là dấu hiệu mất quyền ở một project.

Khi phát hiện bất thường, script nên dừng và gửi cảnh báo thay vì ghi đè báo cáo bằng kết quả rỗng. Một báo cáo sai im lặng gây hại hơn một lần chạy thất bại có thông báo.

Thử qua proxy lab

Lab gọi lại tìm kiếm JRACLOUD trên jira.atlassian.com qua proxy HTTP cục bộ có xác thực ở cổng 9702. Kết quả là 200, total 281, 0,693 giây, header X-AUSERNAME vẫn là anonymous.

px = {"https": "http://user1:p%40ss%232026@127.0.0.1:9702"}
r = requests.get(f"{D}/search", params={"jql": JQL, "maxResults": 5, "fields": "summary"}, proxies=px, timeout=30)

Proxy không thay đổi danh tính người gọi trong mắt Jira. Không token thì vẫn là ẩn danh, có token thì vẫn là chủ token.

Khi nào proxy thực sự cần

Jira Cloud gói doanh nghiệp có thể giới hạn truy cập theo dải IP. Jira Data Center trong mạng công ty thường chỉ mở cho IP văn phòng hoặc VPN. Khi script chạy ở máy chủ khác, nó cần đi qua một IP cố định đã được cho phép.

Trường hợp khác là máy chạy script nằm sau proxy bắt buộc của công ty. Bài định dạng proxy có cách viết URL proxy có tên đăng nhập và mật khẩu chứa ký tự đặc biệt.

Chọn loại proxy khi cần

Danh sách cho phép theo IP cần IP cố định, không dùng proxy xoay. ProxyVN có proxy dân cư tĩnh, proxy datacenter, proxy 4G và proxy xoay, hỗ trợ HTTP và SOCKS5. Anh em có thể mua proxy uy tín tại ProxyVN, chọn IP tĩnh, rồi đề nghị quản trị viên thêm IP đó vào danh sách cho phép của Jira.

Giới hạn suy luận của bài

Phần gọi thật gồm request không token hoặc token giả tới một site Jira Cloud công khai, và request ẩn danh tới Jira Data Center công khai jira.atlassian.com ngày 29/10/2026, Python 3.12.10, requests 2.34.2. Lab không có tài khoản Jira Cloud.

Phân trang nextPageToken, fields mặc định, ADF, trường tùy biến và retry 429 chạy trên server giả lập dựng theo đặc tả OpenAPI v3. Jira thật có thể khác ở chi tiết, ví dụ số issue mỗi trang khi xin nhiều trường. Proxy trong lab là proxy cục bộ.

Checklist Jira API bằng Python

Checklist Jira API

Checklist Jira API

  • Dùng /rest/api/3/search/jql, điểm cuối cũ đã trả 410.
  • Gọi /myself trước, vì tìm kiếm không token trả 200 rỗng.
  • JQL phải có điều kiện giới hạn và ORDER BY ổn định.
  • Liệt kê fields, mặc định chỉ trả id.
  • Đi theo nextPageToken tới khi isLast, không tự tạo token.
  • Kiểm tra kiểu description: dict là ADF, chuỗi là wiki.
  • Giữ null cho trường chưa điền, dùng statusCategory khi so sánh.
  • Bỏ reporter, assignee và thay nhắc tên trước khi xuất.

Câu hỏi thường gặp về Jira API bằng Python

Vì sao code cũ báo lỗi 410?

Code đang gọi /rest/api/3/search. Lab xác nhận điểm cuối này trả 410 trên Jira Cloud và yêu cầu chuyển sang /rest/api/3/search/jql.

Vì sao tìm kiếm trả rỗng dù project có issue?

Có thể request không được xác thực. Lab thấy Jira Cloud trả 200 với issues rỗng khi không có token. Gọi /myself để kiểm tra trước.

Có lấy được total như trước không?

Điểm cuối mới không trả total. Đặc tả có điểm cuối approximate-count để ước lượng, lab chưa thử.

Làm sao đọc mô tả issue?

Ở Jira Cloud, description là cây ADF, duyệt đệ quy để lấy text. Ở Data Center, description là chuỗi wiki markup.

Có thư viện Python sẵn không?

Có thư viện cộng đồng cho Jira. Kiểm tra thư viện đã chuyển sang điểm cuối search/jql chưa, vì phiên bản cũ có thể vẫn gọi điểm cuối đã gỡ.

Proxy có giúp vượt giới hạn request không?

Không. Giới hạn tính theo người gọi có xác thực. Proxy chỉ cần khi Jira giới hạn IP hoặc mạng bắt buộc đi qua proxy. Bài web scraping proxy là gì giải thích khi nào IP thật sự quan trọng.

Jira API bằng Python và những điều cần nhớ

Jira API bằng Python cần đúng điểm cuối, đúng quyền và đúng cách đọc ADF. Lab ngày 29/10/2026 thấy điểm cuối tìm kiếm cũ trả 410, tìm kiếm không token trả 200 rỗng và truy vấn không giới hạn trả 400. Lab cũng đọc 200 issue thật qua phân trang offset của Data Center và chạy nextPageToken trên server giả lập. Gọi /myself trước khi tin kết quả rỗng, giữ null và bỏ thông tin người dùng. Cần IP tĩnh cho danh sách cho phép khi làm Jira API bằng Python, liên hệ Proxy.vn - Nhà cung cấp dịch vụ proxy chất lượng hàng đầu Việt Nam.

TIN TỨC LIÊN QUAN