如何在C#中向Google Doc表单元格添加内容 [英] How to add content to google doc table cell in c#

查看:45
本文介绍了如何在C#中向Google Doc表单元格添加内容的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将3x3表格插入Google文档,然后使用C#将其文本插入表格单元格.我遇到了这个线程这帮助我添加了表格,并至少在其中一个单元格中获得了一些文本.

I'm trying to insert a 3x3 table into a google doc and then text into the table cells using c#. I came across this thread which helped me get the table added and at least get some text in one of the cells.

该线程中的答案表示要向新创建的表的startindex加4.我这样做了,我所有的文本都被添加到第一行的第二个单元格中.

The answer in that thread said to add 4 to the startindex of the newly created table. I did that and all of my text was just added to the 2nd cell of the first row.

您可以从下面的代码中看到,在for循环中,我希望用一些测试文本填充每个单元格.因此,我不确定为什么将所有文本都放入一个单元格中.

You can see from my code below that in the for loop I'm hoping to populate each cell with some test text. So, I'm not sure why all the text is being put into the one cell.

var docId = "mydocid";

List<Request> requests = new List<Request>
{
    new Request()
    {
        InsertTable = new InsertTableRequest()
        {
            EndOfSegmentLocation = new EndOfSegmentLocation
            {
                SegmentId = ""
            },
            Columns = 3,
            Rows = 3
        }
    }
};

BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest {Requests = requests};

service.Documents.BatchUpdate(body, docId).Execute();

var doc = service.Documents.Get(docId).Execute();

var index = doc.Body.Content.FirstOrDefault(x => x.Table != null).StartIndex + 4;

requests = new List<Request>();

for (var i = 0; i < 3; i++)
{
    index++;

    requests.Add(new Request()
    {
        InsertText = new InsertTextRequest()
        {
            Text = "test 1",
            Location = new Location()
            {
                Index = index
            }
        }
    });

    index++;

    requests.Add(new Request()
    {
        InsertText = new InsertTextRequest()
        {
            Text = "test 2",
            Location = new Location()
            {
                Index = index
            }
        }
    });

    index++;

    requests.Add(new Request()
    {
        InsertText = new InsertTextRequest()
        {
            Text = "test 3",
            Location = new Location()
            {
                Index = index
            }
        }
    });
}

body = new BatchUpdateDocumentRequest { Requests = requests };

service.Documents.BatchUpdate(body, docId).Execute();

经过更多测试之后,我才意识到我最初并没有注意到一个单元格中的文本最终是这样-tttttttttest 3est 2est 1est 3est 2est 1est 3est 2est 1因此,看起来索引不一定用来表示将内容写入哪个单元格,但是是某种类型的子字符串函数.因此,显然我不理解如何遍历每一行和单元格以插入带有index属性的文本.

After testing some more I realized I hadn't originally noticed that the text in the one cell ended up being this - tttttttttest 3est 2est 1est 3est 2est 1est 3est 2est 1 So, it looks like the index isn't necessarily being used to say which cell to write the content to, but some type of substring function. So, clearly I'm not understanding how to iterate through each row and cell to insert text with the index property.

根据请求,这是将请求主体对象转换为json.

As requested, here is the conversion of the request body object to json.

{
    "requests": [{
        "createNamedRange": null,
        "createParagraphBullets": null,
        "deleteContentRange": null,
        "deleteNamedRange": null,
        "deleteParagraphBullets": null,
        "deletePositionedObject": null,
        "deleteTableColumn": null,
        "deleteTableRow": null,
        "insertInlineImage": null,
        "insertPageBreak": null,
        "insertTable": null,
        "insertTableColumn": null,
        "insertTableRow": null,
        "insertText": {
            "endOfSegmentLocation": null,
            "location": {
                "index": 60,
                "segmentId": null,
                "ETag": null
            },
            "text": "test 1",
            "ETag": null
        },
        "replaceAllText": null,
        "updateParagraphStyle": null,
        "updateTableColumnProperties": null,
        "updateTableRowStyle": null,
        "updateTextStyle": null,
        "ETag": null
    }, {
        "createNamedRange": null,
        "createParagraphBullets": null,
        "deleteContentRange": null,
        "deleteNamedRange": null,
        "deleteParagraphBullets": null,
        "deletePositionedObject": null,
        "deleteTableColumn": null,
        "deleteTableRow": null,
        "insertInlineImage": null,
        "insertPageBreak": null,
        "insertTable": null,
        "insertTableColumn": null,
        "insertTableRow": null,
        "insertText": {
            "endOfSegmentLocation": null,
            "location": {
                "index": 61,
                "segmentId": null,
                "ETag": null
            },
            "text": "test 2",
            "ETag": null
        },
        "replaceAllText": null,
        "updateParagraphStyle": null,
        "updateTableColumnProperties": null,
        "updateTableRowStyle": null,
        "updateTextStyle": null,
        "ETag": null
    }, {
        "createNamedRange": null,
        "createParagraphBullets": null,
        "deleteContentRange": null,
        "deleteNamedRange": null,
        "deleteParagraphBullets": null,
        "deletePositionedObject": null,
        "deleteTableColumn": null,
        "deleteTableRow": null,
        "insertInlineImage": null,
        "insertPageBreak": null,
        "insertTable": null,
        "insertTableColumn": null,
        "insertTableRow": null,
        "insertText": {
            "endOfSegmentLocation": null,
            "location": {
                "index": 62,
                "segmentId": null,
                "ETag": null
            },
            "text": "test 3",
            "ETag": null
        },
        "replaceAllText": null,
        "updateParagraphStyle": null,
        "updateTableColumnProperties": null,
        "updateTableRowStyle": null,
        "updateTextStyle": null,
        "ETag": null
    }, {
        "createNamedRange": null,
        "createParagraphBullets": null,
        "deleteContentRange": null,
        "deleteNamedRange": null,
        "deleteParagraphBullets": null,
        "deletePositionedObject": null,
        "deleteTableColumn": null,
        "deleteTableRow": null,
        "insertInlineImage": null,
        "insertPageBreak": null,
        "insertTable": null,
        "insertTableColumn": null,
        "insertTableRow": null,
        "insertText": {
            "endOfSegmentLocation": null,
            "location": {
                "index": 63,
                "segmentId": null,
                "ETag": null
            },
            "text": "test 1",
            "ETag": null
        },
        "replaceAllText": null,
        "updateParagraphStyle": null,
        "updateTableColumnProperties": null,
        "updateTableRowStyle": null,
        "updateTextStyle": null,
        "ETag": null
    }, {
        "createNamedRange": null,
        "createParagraphBullets": null,
        "deleteContentRange": null,
        "deleteNamedRange": null,
        "deleteParagraphBullets": null,
        "deletePositionedObject": null,
        "deleteTableColumn": null,
        "deleteTableRow": null,
        "insertInlineImage": null,
        "insertPageBreak": null,
        "insertTable": null,
        "insertTableColumn": null,
        "insertTableRow": null,
        "insertText": {
            "endOfSegmentLocation": null,
            "location": {
                "index": 64,
                "segmentId": null,
                "ETag": null
            },
            "text": "test 2",
            "ETag": null
        },
        "replaceAllText": null,
        "updateParagraphStyle": null,
        "updateTableColumnProperties": null,
        "updateTableRowStyle": null,
        "updateTextStyle": null,
        "ETag": null
    }, {
        "createNamedRange": null,
        "createParagraphBullets": null,
        "deleteContentRange": null,
        "deleteNamedRange": null,
        "deleteParagraphBullets": null,
        "deletePositionedObject": null,
        "deleteTableColumn": null,
        "deleteTableRow": null,
        "insertInlineImage": null,
        "insertPageBreak": null,
        "insertTable": null,
        "insertTableColumn": null,
        "insertTableRow": null,
        "insertText": {
            "endOfSegmentLocation": null,
            "location": {
                "index": 65,
                "segmentId": null,
                "ETag": null
            },
            "text": "test 3",
            "ETag": null
        },
        "replaceAllText": null,
        "updateParagraphStyle": null,
        "updateTableColumnProperties": null,
        "updateTableRowStyle": null,
        "updateTextStyle": null,
        "ETag": null
    }, {
        "createNamedRange": null,
        "createParagraphBullets": null,
        "deleteContentRange": null,
        "deleteNamedRange": null,
        "deleteParagraphBullets": null,
        "deletePositionedObject": null,
        "deleteTableColumn": null,
        "deleteTableRow": null,
        "insertInlineImage": null,
        "insertPageBreak": null,
        "insertTable": null,
        "insertTableColumn": null,
        "insertTableRow": null,
        "insertText": {
            "endOfSegmentLocation": null,
            "location": {
                "index": 66,
                "segmentId": null,
                "ETag": null
            },
            "text": "test 1",
            "ETag": null
        },
        "replaceAllText": null,
        "updateParagraphStyle": null,
        "updateTableColumnProperties": null,
        "updateTableRowStyle": null,
        "updateTextStyle": null,
        "ETag": null
    }, {
        "createNamedRange": null,
        "createParagraphBullets": null,
        "deleteContentRange": null,
        "deleteNamedRange": null,
        "deleteParagraphBullets": null,
        "deletePositionedObject": null,
        "deleteTableColumn": null,
        "deleteTableRow": null,
        "insertInlineImage": null,
        "insertPageBreak": null,
        "insertTable": null,
        "insertTableColumn": null,
        "insertTableRow": null,
        "insertText": {
            "endOfSegmentLocation": null,
            "location": {
                "index": 67,
                "segmentId": null,
                "ETag": null
            },
            "text": "test 2",
            "ETag": null
        },
        "replaceAllText": null,
        "updateParagraphStyle": null,
        "updateTableColumnProperties": null,
        "updateTableRowStyle": null,
        "updateTextStyle": null,
        "ETag": null
    }, {
        "createNamedRange": null,
        "createParagraphBullets": null,
        "deleteContentRange": null,
        "deleteNamedRange": null,
        "deleteParagraphBullets": null,
        "deletePositionedObject": null,
        "deleteTableColumn": null,
        "deleteTableRow": null,
        "insertInlineImage": null,
        "insertPageBreak": null,
        "insertTable": null,
        "insertTableColumn": null,
        "insertTableRow": null,
        "insertText": {
            "endOfSegmentLocation": null,
            "location": {
                "index": 68,
                "segmentId": null,
                "ETag": null
            },
            "text": "test 3",
            "ETag": null
        },
        "replaceAllText": null,
        "updateParagraphStyle": null,
        "updateTableColumnProperties": null,
        "updateTableRowStyle": null,
        "updateTextStyle": null,
        "ETag": null
    }],
    "writeControl": null,
    "ETag": null
}

根据田边(Tanaike)的建议答案进行编辑.

Edit after Tanaike's suggested answer.

所以这是代码的更新版本.

So here's an updated version of the code.

public class AddendumRow
{
    public string Title {get;set;}
    public string Value {get;set;}
    public string Description {get;set;}
}


var tableRows = new List<AddendumRow>()
{
    new AddendumRow(){Title = "Row 1 Title", Value = "Row 1 Value", Description = "Row 1 Description" },
    new AddendumRow(){Title = "Row 2 Title", Value = "Row 2 Value", Description = "Row 2 Description" },
    new AddendumRow(){Title = "Row 3 Title", Value = "Row 3 Value", Description = "Row 3 Description" }
};

List<Request> requests = new List<Request>
{
    new Request()
    {
        InsertTable = new InsertTableRequest()
        {
            EndOfSegmentLocation = new EndOfSegmentLocation
            {
                SegmentId = ""
            },
            Columns = 3,
            Rows = tableRows.Count
        }
    }
};

BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest {Requests = requests};

service.Documents.BatchUpdate(body, docId).Execute();

var doc = service.Documents.Get(docId).Execute();

var index = doc.Body.Content.FirstOrDefault(x => x.Table != null).StartIndex + 3;

requests = new List<Request>();

foreach (var row in tableRows){

    requests.Add(new Request()
    {
        InsertText = new InsertTextRequest()
        {
            Text = row.Title,
            Location = new Location()
            {
                Index = index
            }
        }
    }); 
    index += 2;

    requests.Add(new Request()
    {
        InsertText = new InsertTextRequest()
        {
            Text = row.Value,
            Location = new Location()
            {
                Index = index
            }
        }
    }); 
    index += 2;

    requests.Add(new Request()
    {
        InsertText = new InsertTextRequest()
        {
            Text = row.Description,
            Location = new Location()
            {
                Index = index
            }
        }
    }); 

    index += 3;
}


body = new BatchUpdateDocumentRequest { Requests = requests };

var json = JsonConvert.SerializeObject(requests);

当我运行该代码(相信与您的示例匹配)时,它将所有内容都放入第一行的第一个单元格中.该单元格的内容是...

When I run that code, which I believe matches your example, it throws all of the content into the first row's first cell. And the content of that cell is...

RoRoRowRoRoRowRoRoRow 3 Descriptionw 3 Valuew 3 Title 2 Descriptionw 2 Valuew 2 Title 1 Descriptionw 1 Valuew 1 Title

您可以看到它似乎正在使用索引作为某种子字符串方法,将文本插入到现有文本中而不是移至下一个单元格.

You can see that it appears to be using the index as some sort of substring method for inserting the text inside existing text instead of moving to the next cell.

此行的结果json-var json = JsonConvert.SerializeObject(requests);在下面.从我的角度来看,它几乎与您的示例相符,但是具有许多其他属性.

The resulting json of this line - var json = JsonConvert.SerializeObject(requests); is below. From what I can see it pretty much matches your example, but just has a lot of additional properties.

[{
    "createNamedRange": null,
    "createParagraphBullets": null,
    "deleteContentRange": null,
    "deleteNamedRange": null,
    "deleteParagraphBullets": null,
    "deletePositionedObject": null,
    "deleteTableColumn": null,
    "deleteTableRow": null,
    "insertInlineImage": null,
    "insertPageBreak": null,
    "insertTable": null,
    "insertTableColumn": null,
    "insertTableRow": null,
    "insertText": {
        "endOfSegmentLocation": null,
        "location": {
            "index": 58,
            "segmentId": null,
            "ETag": null
        },
        "text": "Row 1 Title",
        "ETag": null
    },
    "replaceAllText": null,
    "updateParagraphStyle": null,
    "updateTableColumnProperties": null,
    "updateTableRowStyle": null,
    "updateTextStyle": null,
    "ETag": null
}, {
    "createNamedRange": null,
    "createParagraphBullets": null,
    "deleteContentRange": null,
    "deleteNamedRange": null,
    "deleteParagraphBullets": null,
    "deletePositionedObject": null,
    "deleteTableColumn": null,
    "deleteTableRow": null,
    "insertInlineImage": null,
    "insertPageBreak": null,
    "insertTable": null,
    "insertTableColumn": null,
    "insertTableRow": null,
    "insertText": {
        "endOfSegmentLocation": null,
        "location": {
            "index": 60,
            "segmentId": null,
            "ETag": null
        },
        "text": "Row 1 Value",
        "ETag": null
    },
    "replaceAllText": null,
    "updateParagraphStyle": null,
    "updateTableColumnProperties": null,
    "updateTableRowStyle": null,
    "updateTextStyle": null,
    "ETag": null
}, {
    "createNamedRange": null,
    "createParagraphBullets": null,
    "deleteContentRange": null,
    "deleteNamedRange": null,
    "deleteParagraphBullets": null,
    "deletePositionedObject": null,
    "deleteTableColumn": null,
    "deleteTableRow": null,
    "insertInlineImage": null,
    "insertPageBreak": null,
    "insertTable": null,
    "insertTableColumn": null,
    "insertTableRow": null,
    "insertText": {
        "endOfSegmentLocation": null,
        "location": {
            "index": 62,
            "segmentId": null,
            "ETag": null
        },
        "text": "Row 1 Description",
        "ETag": null
    },
    "replaceAllText": null,
    "updateParagraphStyle": null,
    "updateTableColumnProperties": null,
    "updateTableRowStyle": null,
    "updateTextStyle": null,
    "ETag": null
}, {
    "createNamedRange": null,
    "createParagraphBullets": null,
    "deleteContentRange": null,
    "deleteNamedRange": null,
    "deleteParagraphBullets": null,
    "deletePositionedObject": null,
    "deleteTableColumn": null,
    "deleteTableRow": null,
    "insertInlineImage": null,
    "insertPageBreak": null,
    "insertTable": null,
    "insertTableColumn": null,
    "insertTableRow": null,
    "insertText": {
        "endOfSegmentLocation": null,
        "location": {
            "index": 65,
            "segmentId": null,
            "ETag": null
        },
        "text": "Row 2 Title",
        "ETag": null
    },
    "replaceAllText": null,
    "updateParagraphStyle": null,
    "updateTableColumnProperties": null,
    "updateTableRowStyle": null,
    "updateTextStyle": null,
    "ETag": null
}, {
    "createNamedRange": null,
    "createParagraphBullets": null,
    "deleteContentRange": null,
    "deleteNamedRange": null,
    "deleteParagraphBullets": null,
    "deletePositionedObject": null,
    "deleteTableColumn": null,
    "deleteTableRow": null,
    "insertInlineImage": null,
    "insertPageBreak": null,
    "insertTable": null,
    "insertTableColumn": null,
    "insertTableRow": null,
    "insertText": {
        "endOfSegmentLocation": null,
        "location": {
            "index": 67,
            "segmentId": null,
            "ETag": null
        },
        "text": "Row 2 Value",
        "ETag": null
    },
    "replaceAllText": null,
    "updateParagraphStyle": null,
    "updateTableColumnProperties": null,
    "updateTableRowStyle": null,
    "updateTextStyle": null,
    "ETag": null
}, {
    "createNamedRange": null,
    "createParagraphBullets": null,
    "deleteContentRange": null,
    "deleteNamedRange": null,
    "deleteParagraphBullets": null,
    "deletePositionedObject": null,
    "deleteTableColumn": null,
    "deleteTableRow": null,
    "insertInlineImage": null,
    "insertPageBreak": null,
    "insertTable": null,
    "insertTableColumn": null,
    "insertTableRow": null,
    "insertText": {
        "endOfSegmentLocation": null,
        "location": {
            "index": 69,
            "segmentId": null,
            "ETag": null
        },
        "text": "Row 2 Description",
        "ETag": null
    },
    "replaceAllText": null,
    "updateParagraphStyle": null,
    "updateTableColumnProperties": null,
    "updateTableRowStyle": null,
    "updateTextStyle": null,
    "ETag": null
}, {
    "createNamedRange": null,
    "createParagraphBullets": null,
    "deleteContentRange": null,
    "deleteNamedRange": null,
    "deleteParagraphBullets": null,
    "deletePositionedObject": null,
    "deleteTableColumn": null,
    "deleteTableRow": null,
    "insertInlineImage": null,
    "insertPageBreak": null,
    "insertTable": null,
    "insertTableColumn": null,
    "insertTableRow": null,
    "insertText": {
        "endOfSegmentLocation": null,
        "location": {
            "index": 72,
            "segmentId": null,
            "ETag": null
        },
        "text": "Row 3 Title",
        "ETag": null
    },
    "replaceAllText": null,
    "updateParagraphStyle": null,
    "updateTableColumnProperties": null,
    "updateTableRowStyle": null,
    "updateTextStyle": null,
    "ETag": null
}, {
    "createNamedRange": null,
    "createParagraphBullets": null,
    "deleteContentRange": null,
    "deleteNamedRange": null,
    "deleteParagraphBullets": null,
    "deletePositionedObject": null,
    "deleteTableColumn": null,
    "deleteTableRow": null,
    "insertInlineImage": null,
    "insertPageBreak": null,
    "insertTable": null,
    "insertTableColumn": null,
    "insertTableRow": null,
    "insertText": {
        "endOfSegmentLocation": null,
        "location": {
            "index": 74,
            "segmentId": null,
            "ETag": null
        },
        "text": "Row 3 Value",
        "ETag": null
    },
    "replaceAllText": null,
    "updateParagraphStyle": null,
    "updateTableColumnProperties": null,
    "updateTableRowStyle": null,
    "updateTextStyle": null,
    "ETag": null
}, {
    "createNamedRange": null,
    "createParagraphBullets": null,
    "deleteContentRange": null,
    "deleteNamedRange": null,
    "deleteParagraphBullets": null,
    "deletePositionedObject": null,
    "deleteTableColumn": null,
    "deleteTableRow": null,
    "insertInlineImage": null,
    "insertPageBreak": null,
    "insertTable": null,
    "insertTableColumn": null,
    "insertTableRow": null,
    "insertText": {
        "endOfSegmentLocation": null,
        "location": {
            "index": 76,
            "segmentId": null,
            "ETag": null
        },
        "text": "Row 3 Description",
        "ETag": null
    },
    "replaceAllText": null,
    "updateParagraphStyle": null,
    "updateTableColumnProperties": null,
    "updateTableRowStyle": null,
    "updateTextStyle": null,
    "ETag": null
}]

推荐答案

  • 您要在Google文档中追加一个包含3行3列的新表.
  • 您要将这些值应用于所有单元格.
  • 我可以这样理解.如果我的理解是正确的,那么该修改如何?

    I could understand like this. If my understanding is correct, how about this modification?

    • 在您的情况下,值将放入新表中.在这种情况下,可以将每个值放入每个单元格的起始索引.

    • In your case, the values are put to new table. In this case, each value can be put to the start index of each cell.

    从您的请求正文来看,我认为这种修改后的请求是以下情况.

    From your request body, I supposes that this modified request is the following situation.

    • 具有3行3列的新表已附加到Google文档中.并且表格中的所有单元格都是空的.
    • 将值放入所有单元格.
    • 附加表的
    • startIndex(body.content[].startIndex)是57.
    • 在这种情况下,第1行和第1列的startIndex(body.content[].table.tableRows[0].tableCells[0].content[0].startIndex)为'60'.其他单元格的startIndex如下.

    • New table, which has 3 rows and 3 columns, is appended to Google Document. And all cells of the table are empty.
    • Values are put to all cells.
    • startIndex (body.content[].startIndex) of the appended table is 57.
    • In this case, startIndex (body.content[].table.tableRows[0].tableCells[0].content[0].startIndex) of row 1 and column 1 is '60'. And startIndex of other cells are as follows.

    • 从上图发现,列和行的单元格的偏移量分别为23.

    当通过一次API调用使用batchUpdate方法将值放入所有单元格时,有一个重要意义.

    When the values are put to all cells using the method of batchUpdate by one API call, there is one important point.

    • 例如,将"sample"的值放入行1和列1的单元格(startIndex60.)时,行1和列2的单元格的startIndex变为. 62的值分别是字符串sample的长度和下一个单元格的偏移量.
    • 在您的脚本中,偏移量为1.这样,所有值都放在一个单元格中.
    • 作为将值放入空单元格的一种简单方法,对于具有3行3列的表,它通过将第3行和第3列的单元格中的值反向放置来创建请求主体订单.
    • For example, when a value of "sample" is put to the cell of row 1 and column 1 (startIndex is 60.), startIndex of the cell of row 1 and column 2 becomes 60 + 6 + 2 = 68. The values of 6 and 2 are the length of the string sample and the offset for the next cell, respectively.
    • In your script, the offset is 1. By this, all values are put in one cell.
    • As a simple method for putting values to the empty cells, in the case of the table which has 3 rows and 3 columns, it creates the request body by putting the values from the cell of row 3 and column 3 in the reverse order.

    当以上几点反映到您的请求正文中时,它变为如下.

    When above points are reflected to your request body, it becomes as follows.

    {"requests":[
        {"insertText":{"location":{"index":78},"text":"c3"}},
        {"insertText":{"location":{"index":76},"text":"b3"}},
        {"insertText":{"location":{"index":74},"text":"a3"}},
        {"insertText":{"location":{"index":71},"text":"c2"}},
        {"insertText":{"location":{"index":69},"text":"b2"}},
        {"insertText":{"location":{"index":67},"text":"a2"}},
        {"insertText":{"location":{"index":64},"text":"c1"}},
        {"insertText":{"location":{"index":62},"text":"b1"}},
        {"insertText":{"location":{"index":60},"text":"a1"}}
    ]}
    

    结果:

    当上述请求正文用于表的startIndex57的新表时,可以获得以下结果.如果您使用上述要求正文,请注意index的值.

    Result:

    When above request body is used for the new table that startIndex of table is 57, the following result can be obtained. If you use above request body, please be careful the values of index.

    • Method: documents.batchUpdate
    • Inserting or deleting table rows

    这篇关于如何在C#中向Google Doc表单元格添加内容的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆